Verification: a143cc29221c9be0

Php add values to array key value

Содержание

JIT

Появление JIT как раз во время. Компилятор обещает значительные улучшения производительности, хотя и не всегда это будет в контексте веба. На данный момент не было сделано никаких точных ориентиров, но они обязательно появятся. Что такое JIT  и для чего он будет нужен, можно почитать здесь

Union Types 2.0 (Объединенные типы)

«Объединенные типы» принимают значения нескольких разных типов, а не одного. PHP уже поддерживает два специальных типа объединения:

Type или null, используя специальный синтаксис "?Type"

array или Traversable, используя специальный тип iterable.

Однако произвольные объединенные типы в настоящее время не поддерживаются языком. Вместо этого необходимо использовать аннотации phpdoc, например, в следующем примере:

class Number {
/**
* @var int|float $number
*/
private $number;

/**
* @param int|float $number
*/
public function setNumber($number) {
$this->number = $number;
}

/**
* @return int|float
*/
public function getNumber() {
return $this->number;
}
}

Объединенные типы указываются с использованием синтаксиса T1|T2|… и могут использоваться во всех позициях, где типы в настоящее время принимаются:

class Number {
private int|float $number;

public function setNumber(int|float $number): void {
$this->number = $number;
}

public function getNumber(): int|float {
return $this->number;
}
}

Обратите внимание, что тип void не может быть частью типа объединения, так как он означает «вообще ничего-возвращаемого значения». Кроме того, nullable союзы могут быть написаны с использованием |null или с использованием существующей ? записи:

public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

Оператор nullsafe rfc

Если вы знакомы с оператором объединения c нулевым значением ( ?? ), думаю, что вы уже знакомы с его недостатками: он не работает с вызовами методов. Вместо этого вам нужны будут промежуточные проверки или надо будет полагаться на опциональных помощников, предоставляемых некоторыми фреймворками:

$startDate = $dateAsString = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

С добавлением оператора nullsafe мы теперь можем иметь поведение методов, подобное слиянию null!

$dateAsString = $booking->getStartDate()?->asDateTimeString();

Именованные аргументы rfc

Именованные аргументы позволяют передавать значения в функцию, указывая имя значения, так что вам не нужно учитывать их порядок, а также вы можете пропустить необязательные параметры:

// Использование позиции аргументов:
array_fill(0, 100, 50);

// Использование наименований аргументов:
array_fill(start_index: 0, num: 100, value: 50);

Можно комбинировать именованные аргументы с обычными позиционными аргументами, а также можно указать только некоторые из необязательных аргументов функции, независимо от их порядка:

htmlspecialchars($string, double_encode: false);
//то же самое что и
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

Аттрибуты

Атрибуты, обычно известные в других языках, как аннотации или декораторы, предлагают способ добавлять метаданные в классы, без распарсивания докблоков. Широкое использование парсинга комментариев к документам пользователя показывает, что это очень востребованная функция сообщества. Атрибуты представляют собой специально отформатированный текст, заключенный в «>» путем повторного использования существующих токенов T_SL и T_SR.

Атрибуты могут применяться ко многим вещам в языке:

  • функции (включая замыкания и короткие замыкания)
  • классы (включая анонимные классы), интерфейсы, трейты
  • константы класса
  • свойства класса
  • методы класса
  • параметры функции/метода

Вот пока примерный взгляд из RFC:

use App\Attributes\ExampleAttribute;

>
class Foo
{
>
public const FOO = 'foo';

>
public $x;

>
public function foo(> $bar) { }
}

>
class ExampleAttribute
{
public $value;

public function __construct($value)
{
$this->value = $value;
}
}

Обратите внимание, что эта база Attribute вызывалась PhpAttributeв исходном RFC, но впоследствии была заменена другим RFC . Если вы хотите больше узнать как работают атрибуты, и как вы можете создать свой собственный, то можете прочитать об атрибутах в этом посте Атрибуты в PHP 8. 

Выражение соответствия v2

Это можно было бы назвать старшим братом switch выражения: match может возвращать значения, не требует break операторов, может комбинировать условия, использует строгие сравнения типов и не выполняет никаких типов принуждения.

Вместо этого

switch (1) {
case 0:
$result = 'Foo';
break;
case 1:
$result = 'Bar';
break;
case 2:
$result = 'Baz';
break;
}

echo $result;

Можно писать так:

echo match (1) {
0 => 'Foo',
1 => 'Bar',
2 => 'Baz',
};

Несколько условий могут быть разделены запятыми для выполнения одного и того же блока кода.

$result = match($input) {
0 => "Какой-то Вывод",
'1', '2', '3' => "Вывод условий 1,2,3",
};

Объявление свойств в конструкторе RFC

В настоящее время определение простых объектов значений требует большого количества шаблонов, поскольку все свойства должны повторяться как минимум четыре раза. Рассмотрим следующий простой класс:

class Point {
public float $x;
public float $y;
public float $z;

public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0,
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}

Свойства повторяются 1) в объявлении свойства, 2) в параметрах конструктора и 3) два раза в назначении свойства. Кроме того, тип свойств так же повторяется дважды.

Этот RFC добавляет синтаксический сахар для создания объектов значений или объектов передачи данных. Вместо указания свойств класса и конструктора для них PHP теперь может объединять их в одно. В результате код сокращается до:

class Point { 
публичная функция __construct (
публичный список $ x = 0.0 ,
публичный список $ y = 0.0 ,
публичный список $ z = 0.0 ,
) { }
}

Или еще пример, вместо этого:

class Money 
{
public Currency $currency;

public int $amount;

public function __construct(
Currency $currency,
int $amount,
) {
$this->currency = $currency;
$this->amount = $amount;
}
}

Теперь вы можете сделать это:

class Money 
{
public function __construct(
public Currency $currency,
public int $amount,
) {}
}

Этот сокращенный код строго эквивалентен предыдущему примеру, но более лаконичен. Выбор синтаксиса взят из родственного языка Hack. Более подробно можно почитать в посте объявление свойств в конструкторе.

Новый тип возврата static

Хотя возвращение уже было возможно self, но до PHP 8 он не был допустимым типом возврата static . Учитывая динамически типизированный характер PHP, эта функция будет полезна для многих разработчиков.

class Foo
{
public function method(): static
{
return new static();
}
}

Новый тип mixed v2

С добавлением скалярных типов в PHP 7, обнуляемых в 7.1, объектов в 7.2 и, наконец, типов объединения в 8.0, люди, пишущие код PHP, могут явно объявлять информацию о типах для большинства параметров функции, возвращаемых функций, а также свойств класса. Однако в PHP не всегда поддерживаются типы, и, скорее всего, он всегда будет позволять опускать информацию о типах. Но это приводит к проблеме того, что ее значение неоднозначно, когда отсутствует информация о типе:

  • Функция не возвращает ничего или null
  • Мы ожидаем один из нескольких типов
  • Мы ожидаем, тип, который не может быть подсказан в PHP

Из-за причин, приведенных выше, хорошо, что тип  mixed был наконец добавлен, Сам по себе mixed означает один из этих типов:

  • array
  • bool
  • callable
  • int
  • float
  • null
  • object
  • resource
  • string

Обратите внимание, что mixed также может использоваться как параметр или тип свойства, а не только как тип возвращаемого значения. Также обратите внимание, что, поскольку mixed уже включает в себя null, это не может сделать его обнуляемым. Следующее вызовет ошибку:

// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type.
function bar(): ?mixed {}

Throw выражения

Поскольку в PHP оператор throw не может создавать исключения в тех местах, где разрешены только выражения, такие как функции стрелок, оператор объединения и тернарный оператор. Этот RFC предлагает преобразовать утверждение throw в выражение, чтобы эти случаи стали возможными.

// This was previously not possible since arrow functions only accept a single expression while throw was a statement.
$callable = fn() => throw new Exception();

// $value is non-nullable.
$value = $nullableValue ?? throw new InvalidArgumentException();

// $value is truthy.
$value = $falsableValue ?: throw new InvalidArgumentException();

// $value is only set if the array is not empty.
$value = !empty($array)
? reset($array)
: throw new InvalidArgumentException();

Есть и другие места, где он может быть использован, которые являются более спорными. Эти случаи разрешены в данном RFC

$condition && throw new Exception();
$condition || throw new Exception();
$condition and throw new Exception();
$condition or throw new Exception();

Наследование приватных методов

Раньше PHP применял одинаковые проверки наследования для публичных, защищенных и приватных методов. Другими словами: private методы должны следовать тем же правилам подписи метода, что и protected и public методы. Это не имеет смысла, так как private методы не будут доступны дочерним классам.

Этот RFC изменил данное поведение, так что эти проверки наследования больше не выполняются для приватных методов. Кроме того, использование final private function также не имело смысла, поэтому теперь это вызовет предупреждение:

Warning: Private methods cannot be final as they are never overridden by other classes

Weak maps (Слабые карты)

Построенный на RFC слабых ссылок, который был добавлен в PHP 7.4, В PHP 8 WeakMap  добавляет ​​реализацию, в которой хранятся ссылки на объекты, которые не препятствуют сборке мусора этими объектами.

Возьмем для примера ORM, они часто реализуют кэши, которые содержат ссылки на классы сущностей, чтобы улучшить производительность отношений между сущностями. Эти объекты сущности нельзя собирать, пока кеш имеет ссылку на них, даже если кеш является единственной ссылкой на них.

Если этот слой кэширования использует слабые ссылки и карты вместо этого, PHP будет собирать эти объекты мусором, когда ничто больше не ссылается на них. Особенно в случае ORM, которые могут управлять несколькими сотнями, если не тысячами объектов в запросе; слабые карты могут предложить лучший, более дружественный к ресурсам способ работы с этими объектами.

Вот как выглядят слабые карты, пример из RFC:

class Foo 
{
private WeakMap $cache;

public function getSomethingWithCaching(object $obj): object
{
return $this->cache[$obj]
??= $this->computeSomethingExpensive($obj);
}
}

Использование ::class на объектах

Небольшая, но полезная новая функция: теперь можно использовать ::class на объектах, результат будет идентичен get_class():

//раньше
$bar = new Foo();
echo Foo::class;
//или
echo get_class($bar);
//'Foo'

//теперь можно будет так
$foo = new Foo();
echo $foo::class;
//'Foo'

Неподхваченные уловы

Всякий раз, когда вы хотели перехватить исключение до PHP 8, вы должны были сохранить его в переменной независимо от того, использовали ли вы эту переменную или нет. При отсутствии захвата вы можете пропустить переменную, поэтому вместо этого:

try {
//Что-то идет не так
} catch (MySpecialException $exception) {
Log::error("Что-то пошло не так");
}

Теперь вы можете сделать это:

try {
// Что-то идет не так
} catch (MySpecialException) {
Log::error("Что-то пошло не так");
}

Обратите внимание, что необходимо всегда указывать тип, вы не можете иметь пустой catch. Если вы хотите перехватить все исключения и ошибки, вы можете использовать их Throwable как тип перехвата .

Завершающая запятая в списках параметров

При вызове функции, в списках параметров все еще отсутствовала поддержка запятой. Теперь это разрешено в PHP 8, что означает, что вы можете делать следующее:

public function(
string $parameterA,
int $parameterB,
Foo $objectfoo,
) {
// …
}

Создать DateTime объекты из интерфейса

Вы уже можете создать DateTime объект из DateTimeImmutable объекта, используя DateTime::createFromImmutable($immutableDateTime), но наоборот было сложно. Добавление DateTime::createFromInterface() и DatetimeImmutable::createFromInterface() теперь позволяет получить обобщенный способ конвертировать DateTime и DateTimeImmutable объекты друг в друга.

DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);

Новый Stringable интерфейс

Появится новый интерфейс Stringable, который автоматически добавляется в классы, которые реализуют магический метод __toString(), и нет необходимости реализовывать его вручную. 

У данного RFC две цели:

  • разрешить использовать, string|Stringable чтобы выразить string|object-with-__toString()
  • предоставить прямой путь обновления с PHP 7 до 8
class Foo
{
public function __toString(): string
{
return 'foo';
}
}

function bar(Stringable $stringable) { /* … */ }

bar(new Foo());
bar('abc');

Новая функция str_contains()

str_contains проверяет, содержится ли строка в другой строке, и возвращает логическое значение (true/false), независимо от того, была ли найдена строка. Некоторые могут сказать, что это давно пора, и нам, наконец, больше не нужно полагаться на strpos, чтобы узнать, содержит ли строка другую строку.

Вместо этого:

if (strpos('string with lots of words', 'words') !== false) { /* … */ }

Теперь вы можете сделать это

if (str_contains('string with lots of words', 'words')) { /* … */ }

Новые функции str_starts_with() и str_ends_with()

Две другие давно ожидаемые функции так же добавлены в ядро. str_starts_with() проверяет, начинается ли строка с другой строки, и возвращает логическое значение (true/false).

str_ends_with() логично проверяет, заканчивается ли строка другой строкой, и возвращает логическое значение (true/false). 

str_starts_with('haystack', 'hay'); // true
str_ends_with('haystack', 'stack'); // true

Как правило, эта функциональность достигается за счет использования существующих строковых функций, таких как substr, strpos/strrpos, strncmp или substr_compare(часто в сочетании с strlen), которые имеют различные недостатки. Что интересно,функциональность str_starts_with и str_ends_with настолько необходима, что ее поддерживают многие основные PHP-фреймворки, включая Symfony, Laravel, Yii, FuelPHP и Phalcon.

Новая функция fdiv

Новая функция  fdiv делает что-то подобное типа функций fmod и intdiv, что позволяет произвести деление на 0. Но вместо ошибок вы получите INF, -INF или NAN, в зависимости от случая.

Новая функция get_debug_type()

get_debug_type() возвращает тип переменной. Что-то похоже выдает gettype(), но get_debug_type() возвращает более полезный вывод для массивов, строк, анонимных классов и объектов. Например, вызов gettype() класса \Foo\Bar вернется object. Использование get_debug_type() вернет имя класса.

Полный список различий между get_debug_type()и gettype() можно найти в RFC.

Новая функцияp get_resource_id()

Ресурсы - это специальные переменные в PHP, ссылающиеся на внешние ресурсы. Например, соединение MySQL, или дескриптор файла.

Каждому из этих ресурсов присваивается идентификатор, хотя ранее единственным способом узнать, что это идентификатор, было преобразование ресурса в int:

$resourceId = (int) $resource;

PHP 8 добавляет функцию get_resource_id(), делая эту операцию более очевидной и безопасной для типов:

$resourceId = get_resource_id($resource);

Улучшение абстрактных методов трейтов 

Трейты - это «механизм повторного использования кода в языках с единичным наследованием, таких как PHP». Обычно они используются для объявления методов, которые можно использовать в нескольких классах. Трейты так же могут содержать абстрактные методы, которые должны быть реализованы классами, использующими их. Однако есть предостережение: до PHP 8 сигнатура этих реализаций методов не проверялась. Следующее было действительным:

trait Test {
abstract public function test(int $input): int;
}

class UsesTrait
{
use Test;

public function test($input)
{
return $input;
}
}

PHP 8 будет выполнять правильную проверку подписи метода при использовании свйоства и реализации его абстрактных методов. Это также означает, что подписи методов должны совпадать. Другими словами, тип и количество требуемых аргументов должны быть одинаковыми:

class UsesTrait
{
use Test;

public function test(int $input): int
{
return $input;
}
}

Как бы то ни было, по словам автора RFC Никиты Попова , проверка подписи в настоящее время применяется только точечно:

  • Это не применяется в наиболее распространенном случае, когда реализация метода обеспечивается в используемом классом
  • Это принудительно, если реализация исходит из родительского класса
  • Это принудительно, если реализация исходит от дочернего класса

Объектно-ориентированная альтернатива token_get_all()

Функция token_get_all() возвращает массив значений. Этот RFC добавляет класс PhpToken с методом PhpToken::getAll(). Эта реализация работает с объектами вместо простых значений, его легче читать, и потребляет меньше памяти.


Изменения синтаксиса переменных RFC

Унифицированный синтаксис переменной RFC устранил ряд несоответствий в синтаксисе переменной PHP. Этот RFC намеревается решить небольшую горстку пропущенных дел.

Тип аннотации для внутренних функций

Много людей хотят добавить соответствующие аннотации типов для всех внутренних функций. Это означает, что внутренние функции и методы будут иметь полную информацию о типе в отражении.

Расширение ext-json всегда доступен

Ранее можно было скомпилировать PHP без включенного расширения JSON, теперь это больше невозможно. Поскольку JSON так широко используется, то разработчики теперь всегда могут рассчитывать на его наличие, вместо того, чтобы лишний раз убеждаться, что расширение существует.


"Сломанные изменения"

PHP 8 - серьезное обновление и, следовательно, будут серьезные изменения. Лучшее, что можно сделать, это взглянуть на полный список критических изменений в документе ОБНОВЛЕНИЕ . Однако многие из этих критических изменений устарели в предыдущих версиях 7. *, поэтому, если вы были в курсе последних лет, не так уж сложно перейти на PHP 8.

Согласованные постоянные ошибки типов

Пользовательские функции в PHP уже генерируют TypeErrors, но внутренние функции этого не делали, они скорее пропускали предупреждения и возвращали null. Начиная с PHP 8 поведение внутренних функций стало более согласованным.

Переклассифицированы предупреждения

Множество ошибок, которые ранее вызывали только предупреждения или уведомления, были преобразованы в правильные ошибки:

  • Undefined variable (Неопределенная переменная): Error исключение вместо уведомления
  • Undefined array index (Неопределенный индекс массива): предупреждение вместо уведомления
  • Division by zero (Деление на ноль): DivisionByZeroError исключение вместо предупреждения
  • Attempt to increment/decrement property '%s' of non-object (Попытка увеличить/уменьшить свойство "%s" необъекта): Error исключение вместо предупреждения
  • Attempt to modify property '%s' of non-object (Попытка изменить свойство "%s" необъекта): Error исключение вместо предупреждения
  • Attempt to assign property '%s' of non-object (Попытка назначить свойство "%s" необъекта): Error исключение вместо предупреждения
  • Creating default object from empty value (Создание объекта по умолчанию из пустого значения): Error исключение вместо предупреждения
  • Trying to get property '%s' of non-object (Попытка получить свойство "%s" необъекта): предупреждение вместо уведомления
  • Undefined property (Неопределенное свойство): %s::$%s: предупреждение вместо уведомления
  • Cannot add element to the array as the next element is already occupied (Невозможно добавить элемент в массив, так как следующий элемент уже занят): Error исключение вместо предупреждения
  • Cannot unset offset in a non-array variable (Невозможно сбросить смещение в переменной, не являющейся массивом): Error исключение вместо предупреждения
  • Cannot use a scalar value as an array (Нельзя использовать скалярное значение в качестве массива): Error исключение вместо предупреждения
  • Only arrays and Traversables can be unpacked (Только массивы и Traversables могут быть распакованы): TypeError исключение вместо предупреждения
  • Invalid argument supplied for foreach() (Указан неверный аргумент для foreach ()): TypeError исключение вместо предупреждения
  • Illegal offset type (Недопустимый тип смещения): TypeError исключение вместо предупреждения
  • Illegal offset type in isset or empty (Недопустимый тип смещения в isset или empty): TypeError исключение вместо предупреждения
  • Illegal offset type in unset (Недопустимый тип смещения в unset): TypeError исключение вместо предупреждения
  • Array to string conversion (Преобразование массива в строку): предупреждение вместо уведомления
  • Resource ID#%d used as offset, casting to integer (%d) (Идентификатор ресурса #%d, используемый в качестве смещения, приведение к целому числу (%d)): предупреждение вместо уведомления
  • String offset cast occurred (Произошло приведение смещения строки): предупреждение вместо уведомления
  • Uninitialized string offset: %d (Смещение неинициализированной строки: %d): предупреждение вместо уведомления
  • Cannot assign an empty string to a string offset (Невозможно назначить пустую строку для смещения строки): Error исключение вместо предупреждения

Оператор @ больше не "глушит" фатальные ошибки

Вполне возможно, что это изменение может выявить ошибки, которые снова были скрыты до PHP 8. Обязательно установите display_errors=Off на своих производственных серверах!

Стандартный режим ошибки PDO

Из RFC: текущий режим ошибок по умолчанию для PDO - бесшумный. Это означает, что при возникновении ошибки SQL никакие ошибки или предупреждения не могут выдаваться и не генерируются исключения, если разработчик не реализует свою собственную явную обработку ошибок.

Этот RFC изменяет ошибку по умолчанию, которая изменится на PDO::ERRMODE_EXCEPTION.

Уровень сообщений об ошибках по умолчанию

Теперь по умолчанию в error_reporting уровень ошибок будет установлен в E_ALL вместо текущего  E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Это означает, что могут появиться много ошибок, которые ранее незаметно игнорировались, хотя, возможно, уже существовали до PHP 8.

Приоритет при конкатенации

Хотя это изменение уже устарело в PHP 7.4, теперь это изменение вступает в силу. Если бы вы написали что-то вроде этого:

echo "sum: " . $a + $b;

PHP ранее интерпретировал бы это так:

echo ("sum: " . $a) + $b;

PHP 8 сделает так, чтобы он интерпретировался так:

echo "sum: " . ($a + $b);

Более строгие проверки типов для арифметических и побитовых операторов

До PHP 8 можно было применять арифметические или побитовые операторы к массивам, ресурсам или объектам. Это больше не возможно и выдаст TypeError:

[] % [42];
$object + 4;

Имена в пространствах имен являются одним токеном rfc

PHP используется для интерпретации каждой части пространства имен (разделенной обратной косой чертой \) как последовательности токенов. Этот RFC изменил это поведение, что означает, что теперь в пространствах имен можно использовать зарезервированные имена.

// In the library:
namespace iter\fn;

function operator($operator, $operand = null) { ... }

// In the using code:
use iter\fn;

iter\map(fn\operator('*', 2), $nums);

Более разумные числовые строки rfc

Система типов PHP пытается делать много умных вещей, когда встречает числа в строках. Этот RFC делает такое поведение более последовательным и понятным.

Более разумное сравнение чисел и строк rfc

Этот RFC исправляет очень странный случай в PHP, когда 0 == "foo" возвращает результат как true. Есть и другие крайние случаи, подобные этому, и этот RFC исправляет их.

Изменения подписи метода отражения

Три сигнатуры методов классов отражения были изменены:

ReflectionClass::newInstance($args);
ReflectionFunction::invoke($args);
ReflectionMethod::invoke($object, $args);

Теперь стали:

ReflectionClass::newInstance(...$args);
ReflectionFunction::invoke(...$args);
ReflectionMethod::invoke($object, ...$args);

В руководстве по обновлению указано, что если вы расширяете эти классы и по-прежнему хотите поддерживать как PHP 7, так и PHP 8, допускаются следующие подписи:

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);

Стабильная сортировка rfc

До PHP 8 алгоритмы сортировки были нестабильны. Это означает, что порядок равных элементов не был гарантирован. PHP 8 изменяет поведение всех функций сортировки на стабильную сортировку. 

Стабильные сортировки полезны, прежде всего, при сортировке сложных данных только по некоторой части этих данных. Рассмотрим этот пример:

usort($users, function($user1, $user2) {
return $user1->age $user2->age;
});

Этот код сортирует пользователей по возрасту. В настоящее время порядок пользователей в одной возрастной группе будет произвольным. При стабильной сортировке исходный порядок объектов будет сохранен. Например, если $users уже был отсортирован по имени, то $users теперь будут отсортированы по возрасту первым и по имени вторым. Конечно, в этом случае можно было бы явно отсортировать по двум критериям:

usort($users, function($user1, $user2) {
return $user1->age $user2->age
?: $user1->name $user2->name;
});

Однако это не всегда возможно, поскольку критерий, по которому данные были первоначально отсортированы, явно не сохраняется. Недавним случаем, с которым я столкнулся, был список git коммитов с метаданными, которые хранились в порядке push (но порядок push не был явно сохранен при каждом коммите).

Помимо предоставленных пользователем функций сравнения, другой случай, когда стабильная сортировка часто желательна, - это функция asort(), которая сортирует по значению, но сохраняет ключи.

$array  =  [ 
'c' => 1 ,
'd' => 1 ,
'a' => 0 ,
'b' => 0 ,
];
asort($array) ;

// При стабильной сортировке результат всегда:
[ 'a' => 0 , 'b' => 0 , 'c' => 1 , 'd' => 1 ]

// При нестабильной сортировке возможны также следующие результаты:
[ 'b' => 0 , 'a' => 0 , 'c' => 1 , 'd' => 1 ]
[ 'a' => 0 , 'b' => 0 , 'd' => 1 , 'c' => 1 ]
[ 'b' => 0 , 'a' => 0 , 'd' => 1 , 'c' => 1 ]

Можно эмулировать стабильную сортировку поверх нестабильной, явно сохраняя исходный порядок элементов и используя его в качестве критерия сравнения, но дополнительное косвенное обращение делает сортировку намного медленнее, а также резко увеличивает использование памяти во время сортировки.

Этот RFC предлагает сделать все функции сортировки PHP стабильными. Сюда входят rsort, usort, asort, arsort, uasort, ksort, krsort, uksort, array_multisort, а также соответствующие методы ArrayObject.

Что есть map?

До ES6 разработчики JavaScript использовали объекты для сопоставления ключей со значениями. Однако использование объекта в качестве карты имеет свои ограничения. Например:

  • Не существует надежного способа перебора ключей, и keys()метод преобразует поля в строки, что приводит к конфликту ключей.
  • Нет простого способа добавить новые ключи и значения

ES6 представил несколько новых встроенных классов , включая называемый тип коллекцииMap , который может содержать пары ключ-значение любого типа. В отличие от объектного подхода, новый объект Map может запоминать порядок вставки ключей.

Проще говоря, JavaScript Map- это ассоциативный набор различных ключей и значений. И ключи, и значения могут быть любым примитивом или объектом. Это важная структура данных, которая может быть полезна для многих целей.

Примечание: A WeakMapпохож на Map, но все ключи a WeakMapявляются объектами.

Для создания нового Mapмы используем следующий синтаксис:

let map = new Map([iterable]);

Давайте применим это на практике на более сложном примере. Ниже у нас есть карта, в которой имена являются ключами, а оценки — значениями.

‘use strict’;

//START:DEFINE

const scores =

  new Map([[‘Sara’, 12], [‘Bob’, 11], [‘Jill’, 15], [‘Bruce’, 14]]);

scores.set(‘Jake’, 14);

console.log(scores.size);

//END:DEFINE

  • scores Карта была инициализирована с именами и оценки. Начальные данные могут быть любыми итеративными с парой ключей и значений.
  • Мы добавляем ключ и значение на карту, используя set()метод (строка 7)
  • Чтобы выяснить, сколько ключей в настоящее время находится на карте, мы используем свойство size (строка 9).

Примечание: Map.has(key) выше будет возвращено логическое значение, чтобы указать, находится ли элемент, связанный с указанным ключом, на карте.

Как пользоваться картой

Когда мы узнаем, как создавать карты с помощью JavaScript, мы сможем многое сделать с ними.

Перебирать карты

Во-первых, давайте узнаем об итерации с помощью карт. Мы можем использовать 3 метода:

  • map.keys(): возвращает итерацию для ключей
  • map.entries(): возвращает итерацию для записей [key, value]
  • map.values(): возвращает итерацию для значений

Мы можем перебирать коллекцию ключей и значений с помощью entries()метода, который возвращает итерацию, поэтому мы можем использовать улучшенное for loopвместе с деструктуризацией.

Например, ниже мы извлекаем имя и оценку для каждой пары ключ-значение:

‘use strict’;

//START:DEFINE

const scores =

  new Map([[‘Sara’, 12], [‘Bob’, 11], [‘Jill’, 15], [‘Bruce’, 14]]);

scores.set(‘Jake’, 14);

//END:DEFINE

for(const [name, score] of scores.entries()) {

  console.log(`${name} : ${score}`);

}

Мы также можем использовать forEachметод, который является внутренним итератором.

‘use strict’;

//START:DEFINE

const scores =

  new Map([[‘Sara’, 12], [‘Bob’, 11], [‘Jill’, 15], [‘Bruce’, 14]]);

scores.set(‘Jake’, 14);

//END:DEFINE

scores.forEach((score, name) => console.log(`${name} : ${score}`));

Первый параметр, который получает функция, — это значение ключа, который появляется как второй параметр. Тот же forEach()метод можно использовать для перебора только значений:

‘use strict’;

//START:DEFINE

const scores =

  new Map([[‘Sara’, 12], [‘Bob’, 11], [‘Jill’, 15], [‘Bruce’, 14]]);

scores.set(‘Jake’, 14);

//END:DEFINE

scores.forEach(score => console.log(score));

Если вы получите только один параметр, это будет значение, а если вы получите два параметра, то это будет значение и ключ для каждой пары ключ-значение.

Инициализировать карту с итерируемым объектом

Вы также можете передать конструктору итерируемый объект Map():

let userRoles = new Map([

    [sarah, ‘admin’],

    [bob, ‘editor’],

    [jill, ‘subscriber’]

]);

Получить элемент с карты по ключу

Мы можем получить элементы с карты по ключу с помощью get()метода:

Но если вы передадите ключ, которого нет на этой карте, он вернет undefined.

userRoles.get(sarah); // admin

Но если вы передадите ключ, которого нет на этой карте, он вернет undefined.

let foo = {name: 'Foo'};
userRoles.get(foo); //undefined

Получить количество элементов на карте

Мы можем использовать sizeсвойство, чтобы получить количество элементов на наших картах.

console.log(userRoles.size); // 3

Преобразование ключей или значений карты в массив

Иногда вам может понадобиться работать с массивом вместо итерируемого объекта. Мы можем использовать оператор распространения, чтобы преобразовать ключи для каждого элемента в новый массив.

var keys = [...userRoles.keys()];
console.log(keys);

Этот фрагмент кода преобразует значения элементов в массив:

var roles = [...userRoles.values()];
console.log(roles);

Другие важные методы карты

  • clear(): удаляет элементы из объекта карты.
  • map.set(key, value): сохраняет значение по ключу
  • delete(key): удаляет определенный элемент (указанный ключом)
  • set(key, value): устанавливает значение ключа и возвращает объект карты. Может быть связан с другими методами.
  • forEach(callback[, thisArg]): вызывает обратный вызов для каждой пары «ключ-значение» в порядке вставки. thisArgПараметр является необязательным и устанавливает thisзначение для каждого обратного вызова.
  • has(key): возвращает, trueесли значение, связанное с ключом, существует, в противном случае false.
  • keys(): возвращает новый итератор с ключами для элементов в порядке вставки.
  • values(): возвращает новый объект итератора со значениями для каждого элемента в порядке вставки.
  • map.size: возвращает текущее количество элементов

Что есть set?

Set- еще одна новая коллекция, представленная ES6. ArrayКласс JavaScript может работать с упорядоченным набором данных, но не так хорошо с неупорядоченными коллекциями или когда значения хранятся в коллекции являются уникальными. Вот почему появился JavaScript Set.

A set- это уникальный набор примитивов и объектов, дублирование которых не допускается. Мы можем либо создать пустой набор и добавить объекты, либо инициализировать набор содержимым итерации (например, массива).

Давайте рассмотрим это на примере. Ниже у нас есть набор имен с пятью значениями. Одно из значений не входит в набор из-за дублирования.

‘use strict’;

//START:CREATE

const names = new Set([‘Jack’, ‘Jill’, ‘Jake’, ‘Jack’, ‘Sara’]);

//END:CREATE

//START:SIZE

console.log(names.size);

//END:SIZE

Мы можем добавлять элементы в существующий набор, как показано ниже:

names.add('Matt');

add()Метод возвращает поток Set, который является полезным для цепных операций, таких как более звонков add()или других методов Set:

names.add('Kate')
  .add('Kara');

Как использовать set

Как только мы выясним, как создавать наборы, с ними легко работать. Сначала посмотрим на встроенные функции для наборов:

  • has(): чтобы проверить, есть ли в наборе определенный элемент.
  • clear(): очистить существующий набор или удалить существующий элемент с помощью delete()метода.
  • keys(): получить все значения из набора
  • entries(): для перебора Set с использованием расширенного цикла for, как показано ниже:

‘use strict’;

//START:CREATE

const names = new Set([‘Jack’, ‘Jill’, ‘Jake’, ‘Jack’, ‘Sara’]);

//END:CREATE

//START:ADD

names.add(‘Mike’);

//END:ADD

//START:ADD2

names.add(‘Kate’)

  .add(‘Kara’);

//END:ADD2

console.log(names.has(‘Brad’));

console.log(names.entries());

console.log(names.keys());

console.log(names.values());

//START:ITERATE1

for(const name of names) {

  console.log(name);

}

//END:ITERATE1

filter/ mapс наборами

Set еще не предлагает таких методов, как filter()и map(), но мы можем создать массив из набора и использовать методы функционального стиля для этого нового массива.

Например, ниже мы используем методы filter(), map()и, forEach()чтобы выбрать только имена, начинающиеся с, Jа затем преобразовать их в верхний регистр.

‘use strict’;

//START:CREATE

const names = new Set([‘Jack’, ‘Jill’, ‘Jake’, ‘Jack’, ‘Sara’]);

//END:CREATE

//START:ADD

names.add(‘Mike’);

//END:ADD

//START:ADD2

names.add(‘Kate’)

  .add(‘Kara’);

//END:ADD2

//START:FILTER

[…names].filter(name => name.startsWith(‘J’))

  .map(name => name.toUpperCase())

  .forEach(name => console.log(name));

//END:FILTER

Get the size of a Set

Используйте sizeсвойство объекта Set, чтобы вернуть его размер.

let size = chars.size;
console.log(size);//  3

Удалить элементы из набора

Чтобы удалить элемент из набора, используйте delete()метод.

chars.delete('f');
console.log(chars); // Set {"a", "b", "c", "d", "e"}

А чтобы удалить все элементы набора, используйте clear()метод:

chars.clear();
console.log(chars); // Set{}

Вызов функции обратного вызова для каждого элемента

Чтобы вызвать обратный вызов для каждого элемента вашего набора, используйте forEach()метод.

roles.forEach(role => console.log(role.toUpperCase()));

Другие важные методы Set

  • new Set(iterable): создает набор.
  • set.add(value): добавляет заданное значение и возвращает набор
  • set.has(value): возвращается, trueесли значение существует в наборе, в противном случае возвращается false.
  • set.clear(): удаляет все из набора

Практическое упражнение с map

Чтобы закрепить ваше обучение, давайте выполним практическое упражнение с картой на JavaScript. Используйте Mapдля получения желаемого результата, как указано ниже. При создании объекта createTodo()он должен возвращать элемент карты.

Входные звонки Выход
console.log(todo.get(‘learn JavaScript’)); Выполнено
console.log(todo.get(‘write elegant code’)); работа в процессе
console.log(todo.get(‘automate tests’)); работа в процессе
console.log(completedCount(todo)); 1

Ниже приводится решение этой проблемы. Сначала попробуйте сами.

‘use strict’;

const createTodo = function() {

  const todo = new Map();

  return todo;

};

const completedCount = function(map) {

  return;

};

const todo = createTodo(); //Returns a Map

Разбивка решения

Начнем с создания элемента карты. MapОбъект todoсоздается на линии 4 , используя встроенный класс. Вы можете видеть, что объект карты todoвызывается Map.get()с разными ключами для получения их значений. Это означает, что нам нужно добавить все ключи и значения.

Мы добавляем новый элемент todoс ключами и соответствующими значениями. В строках 5-7 мы добавляем новые элементы, устанавливая значения для ключей.

Для completedCount()мы определяем новую функцию с параметром объекта карты. Функция вернет количество выполненных задач. Итак, по сути, мы фильтруем все значения элементов в объекте карты, чтобы получить элементы со значением, равным done(см. Строку 14).

В строке 15 свойство length используется для подсчета количества специальных элементов.

Введение

Laravel содержит множество глобальных «вспомогательных» функций PHP. Многие из этих функций используются самим фреймворком; однако, вы можете использовать их в своих собственных приложениях, если сочтете их удобными.

Доступные методы

Массивы и объекты

  • Arr::accessible
  • Arr::add
  • Arr::collapse
  • Arr::crossJoin
  • Arr::divide
  • Arr::dot
  • Arr::except
  • Arr::exists
  • Arr::first
  • Arr::flatten
  • Arr::forget
  • Arr::get
  • Arr::has
  • Arr::hasAny
  • Arr::isAssoc
  • Arr::last
  • Arr::only
  • Arr::pluck
  • Arr::prepend
  • Arr::pull
  • Arr::query
  • Arr::random
  • Arr::set
  • Arr::shuffle
  • Arr::sort
  • Arr::sortRecursive
  • Arr::where
  • Arr::wrap
  • data_fill
  • data_get
  • data_set
  • head
  • last

Пути

  • app_path
  • base_path
  • config_path
  • database_path
  • mix
  • public_path
  • resource_path
  • storage_path

Строки

  • __
  • class_basename
  • e
  • preg_replace_array
  • Str::after
  • Str::afterLast
  • Str::ascii
  • Str::before
  • Str::beforeLast
  • Str::between
  • Str::camel
  • Str::contains
  • Str::containsAll
  • Str::endsWith
  • Str::finish
  • Str::is
  • Str::isAscii
  • Str::isUuid
  • Str::kebab
  • Str::length
  • Str::limit
  • Str::lower
  • Str::markdown
  • Str::orderedUuid
  • Str::padBoth
  • Str::padLeft
  • Str::padRight
  • Str::plural
  • Str::pluralStudly
  • Str::random
  • Str::remove
  • Str::replace
  • Str::replaceArray
  • Str::replaceFirst
  • Str::replaceLast
  • Str::singular
  • Str::slug
  • Str::snake
  • Str::start
  • Str::startsWith
  • Str::studly
  • Str::substr
  • Str::substrCount
  • Str::title
  • Str::ucfirst
  • Str::upper
  • Str::uuid
  • Str::wordCount
  • Str::words
  • trans
  • trans_choice

Строки Fluent

Строки Fluent обеспечивают более гибкий объектно-ориентированный интерфейс для работы со строковыми значениями, позволяя объединять несколько строковых операций вместе с использованием более удобочитаемого синтаксиса по сравнению с традиционными строковыми операциями.

  • after
  • afterLast
  • append
  • ascii
  • basename
  • before
  • beforeLast
  • camel
  • contains
  • containsAll
  • dirname
  • endsWith
  • exactly
  • explode
  • finish
  • is
  • isAscii
  • isEmpty
  • isNotEmpty
  • kebab
  • length
  • limit
  • lower
  • ltrim
  • markdown
  • match
  • matchAll
  • padBoth
  • padLeft
  • padRight
  • pipe
  • plural
  • prepend
  • remove
  • replace
  • replaceArray
  • replaceFirst
  • replaceLast
  • replaceMatches
  • rtrim
  • singular
  • slug
  • snake
  • split
  • start
  • startsWith
  • studly
  • substr
  • tap
  • test
  • title
  • trim
  • ucfirst
  • upper
  • when
  • whenEmpty
  • words

URL-адреса

  • action
  • asset
  • route
  • secure_asset
  • secure_url
  • url

Разное

  • abort
  • abort_if
  • abort_unless
  • app
  • auth
  • back
  • bcrypt
  • blank
  • broadcast
  • cache
  • class_uses_recursive
  • collect
  • config
  • cookie
  • csrf_field
  • csrf_token
  • dd
  • dispatch
  • dump
  • env
  • event
  • filled
  • info
  • logger
  • method_field
  • now
  • old
  • optional
  • policy
  • redirect
  • report
  • request
  • rescue
  • resolve
  • response
  • retry
  • session
  • tap
  • throw_if
  • throw_unless
  • today
  • trait_uses_recursive
  • transform
  • validator
  • value
  • view
  • with

Список методов

Массивы и объекты

Arr::accessible()

Метод Arr::accessible определяет, доступно ли переданное значение массиву:

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;

$isAccessible = Arr::accessible(['a' => 1, 'b' => 2]);



$isAccessible = Arr::accessible(new Collection);



$isAccessible = Arr::accessible('abc');



$isAccessible = Arr::accessible(new stdClass);


Arr::add()

Метод Arr::add добавляет переданную пару ключ / значение в массив, если указанный ключ еще не существует в массиве или установлен как null:

use Illuminate\Support\Arr;

$array = Arr::add(['name' => 'Desk'], 'price', 100);



$array = Arr::add(['name' => 'Desk', 'price' => null], 'price', 100);


Arr::collapse()

Метод Arr::collapse сворачивает массив массивов в один массив:

use Illuminate\Support\Arr;

$array = Arr::collapse([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);


Arr::crossJoin()

Метод Arr::crossJoin перекрестно соединяет указанные массивы, возвращая декартово произведение со всеми возможными перестановками:

use Illuminate\Support\Arr;

$matrix = Arr::crossJoin([1, 2], ['a', 'b']);



$matrix = Arr::crossJoin([1, 2], ['a', 'b'], ['I', 'II']);


Arr::divide()

Метод Arr::divide возвращает два массива: один содержит ключи, а другой – значения переданного массива:

use Illuminate\Support\Arr;

[$keys, $values] = Arr::divide(['name' => 'Desk']);




Arr::dot()

Метод Arr::dot объединяет многомерный массив в одноуровневый, использующий «точечную нотацию» для обозначения глубины:

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

$flattened = Arr::dot($array);


Arr::except()

Метод Arr::except удаляет переданные пары ключ / значение из массива:

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100];

$filtered = Arr::except($array, ['price']);


Arr::exists()

Метод Arr::exists проверяет, существует ли переданный ключ в указанном массиве:

use Illuminate\Support\Arr;

$array = ['name' => 'John Doe', 'age' => 17];

$exists = Arr::exists($array, 'name');



$exists = Arr::exists($array, 'salary');


Arr::first()

Метод Arr::first возвращает первый элемент массива, прошедший тест переданного замыкания на истинность:

use Illuminate\Support\Arr;

$array = [100, 200, 300];

$first = Arr::first($array, function ($value, $key) {
    return $value >= 150;
});


Значение по умолчанию может быть передано в качестве третьего аргумента методу. Это значение будет возвращено, если ни одно из значений не пройдет проверку на истинность:

use Illuminate\Support\Arr;

$first = Arr::first($array, $callback, $default);

Arr::flatten()

Метод Arr::flatten объединяет многомерный массив в одноуровневый:

use Illuminate\Support\Arr;

$array = ['name' => 'Joe', 'languages' => ['PHP', 'Ruby']];

$flattened = Arr::flatten($array);


Arr::forget()

Метод Arr::forget удаляет переданную пару ключ / значение из глубоко вложенного массива, используя «точечную нотацию»:

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

Arr::forget($array, 'products.desk');


Arr::get()

Метод Arr::get извлекает значение из глубоко вложенного массива, используя «точечную нотацию»:

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

$price = Arr::get($array, 'products.desk.price');


Метод Arr::get также принимает значение по умолчанию, которое будет возвращено, если указанный ключ отсутствует в массиве:

use Illuminate\Support\Arr;

$discount = Arr::get($array, 'products.desk.discount', 0);


Arr::has()

Метод Arr::has проверяет, существует ли переданный элемент или элементы в массиве, используя «точечную нотацию»:

use Illuminate\Support\Arr;

$array = ['product' => ['name' => 'Desk', 'price' => 100]];

$contains = Arr::has($array, 'product.name');



$contains = Arr::has($array, ['product.price', 'product.discount']);


Arr::hasAny()

Метод Arr::hasAny проверяет, существует ли какой-либо элемент в переданном наборе в массиве, используя «точечную нотацию»:

use Illuminate\Support\Arr;

$array = ['product' => ['name' => 'Desk', 'price' => 100]];

$contains = Arr::hasAny($array, 'product.name');



$contains = Arr::hasAny($array, ['product.name', 'product.discount']);



$contains = Arr::hasAny($array, ['category', 'product.discount']);


Arr::isAssoc()

Метод Arr::isAssoc возвращает true, если переданный массив является ассоциативным. Массив считается ассоциативным, если в нем нет последовательных цифровых ключей, начинающихся с нуля:

use Illuminate\Support\Arr;

$isAssoc = Arr::isAssoc(['product' => ['name' => 'Desk', 'price' => 100]]);



$isAssoc = Arr::isAssoc([1, 2, 3]);


Arr::last()

Метод Arr::last возвращает последний элемент массива, прошедший тест переданного замыкания на истинность:

use Illuminate\Support\Arr;

$array = [100, 200, 300, 110];

$last = Arr::last($array, function ($value, $key) {
    return $value >= 150;
});


Значение по умолчанию может быть передано в качестве третьего аргумента методу. Это значение будет возвращено, если ни одно из значений не пройдет проверку на истинность:

use Illuminate\Support\Arr;

$last = Arr::last($array, $callback, $default);

Arr::only()

Метод Arr::only возвращает только указанные пары ключ / значение из переданного массива:

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];

$slice = Arr::only($array, ['name', 'price']);


Arr::pluck()

Метод Arr::pluck извлекает все значения для указанного ключа из массива:

use Illuminate\Support\Arr;

$array = [
    ['developer' => ['id' => 1, 'name' => 'Taylor']],
    ['developer' => ['id' => 2, 'name' => 'Abigail']],
];

$names = Arr::pluck($array, 'developer.name');


Вы также можете задать ключ результирующего списка:

use Illuminate\Support\Arr;

$names = Arr::pluck($array, 'developer.name', 'developer.id');


Arr::prepend()

Метод Arr::prepend помещает элемент в начало массива:

use Illuminate\Support\Arr;

$array = ['one', 'two', 'three', 'four'];

$array = Arr::prepend($array, 'zero');


При необходимости вы можете указать ключ, который следует использовать для значения:

use Illuminate\Support\Arr;

$array = ['price' => 100];

$array = Arr::prepend($array, 'Desk', 'name');


Arr::pull()

Метод Arr::pull возвращает и удаляет пару ключ / значение из массива:

use Illuminate\Support\Arr;

$array = ['name' => 'Desk', 'price' => 100];

$name = Arr::pull($array, 'name');




Значение по умолчанию может быть передано в качестве третьего аргумента методу. Это значение будет возвращено, если ключ не существует:

use Illuminate\Support\Arr;

$value = Arr::pull($array, $key, $default);

Arr::query()

Метод Arr::query преобразует массив в строку запроса:

use Illuminate\Support\Arr;

$array = [
    'name' => 'Taylor',
    'order' => [
        'column' => 'created_at',
        'direction' => 'desc'
    ]
];

Arr::query($array);


Arr::random()

Метод Arr::random возвращает случайное значение из массива:

use Illuminate\Support\Arr;

$array = [1, 2, 3, 4, 5];

$random = Arr::random($array);


Вы также можете указать количество элементов для возврата в качестве необязательного второго аргумента. Обратите внимание, что при указании этого аргумента, будет возвращен массив, даже если требуется только один элемент:

use Illuminate\Support\Arr;

$items = Arr::random($array, 2);


Arr::set()

Метод Arr::set устанавливает значение с помощью «точечной нотации» во вложенном массиве:

use Illuminate\Support\Arr;

$array = ['products' => ['desk' => ['price' => 100]]];

Arr::set($array, 'products.desk.price', 200);


Arr::shuffle()

Метод Arr::shuffle случайным образом перемешивает элементы в массиве:

use Illuminate\Support\Arr;

$array = Arr::shuffle([1, 2, 3, 4, 5]);


Arr::sort()

Метод Arr::sort сортирует массив по его значениям:

use Illuminate\Support\Arr;

$array = ['Desk', 'Table', 'Chair'];

$sorted = Arr::sort($array);


Вы также можете отсортировать массив по результатам переданного замыкания:

use Illuminate\Support\Arr;

$array = [
    ['name' => 'Desk'],
    ['name' => 'Table'],
    ['name' => 'Chair'],
];

$sorted = array_values(Arr::sort($array, function ($value) {
    return $value['name'];
}));


Arr::sortRecursive()

Метод Arr::sortRecursive рекурсивно сортирует массив с помощью метода sort для числовых подмассивов и ksort для ассоциативных подмассивов:

use Illuminate\Support\Arr;

$array = [
    ['Roman', 'Taylor', 'Li'],
    ['PHP', 'Ruby', 'JavaScript'],
    ['one' => 1, 'two' => 2, 'three' => 3],
];

$sorted = Arr::sortRecursive($array);


Arr::where()

Метод Arr::where фильтрует массив, используя переданное замыкание:

use Illuminate\Support\Arr;

$array = [100, '200', 300, '400', 500];

$filtered = Arr::where($array, function ($value, $key) {
    return is_string($value);
});


Arr::wrap()

Метод Arr::wrap оборачивает переданное значение в массив. Если переданное значение уже является массивом, то оно будет возвращено без изменений:

use Illuminate\Support\Arr;

$string = 'Laravel';

$array = Arr::wrap($string);


Если переданное значение равно null, то будет возвращен пустой массив:

use Illuminate\Support\Arr;

$array = Arr::wrap(null);


data_fill()

Функция data_fill устанавливает отсутствующее значение с помощью «точечной нотации» во вложенном массиве или объекте:

$data = ['products' => ['desk' => ['price' => 100]]];

data_fill($data, 'products.desk.price', 200);



data_fill($data, 'products.desk.discount', 10);


Допускается использование метасимвола подстановки *:

$data = [
    'products' => [
        ['name' => 'Desk 1', 'price' => 100],
        ['name' => 'Desk 2'],
    ],
];

data_fill($data, 'products.*.price', 200);


data_get()

Функция data_get возвращает значение с помощью «точечной нотации» из вложенного массива или объекта:

$data = ['products' => ['desk' => ['price' => 100]]];

$price = data_get($data, 'products.desk.price');


Функция data_get также принимает значение по умолчанию, которое будет возвращено, если указанный ключ не найден:

$discount = data_get($data, 'products.desk.discount', 0);


Допускается использование метасимвола подстановки *, предназначенный для любого ключа массива или объекта:

$data = [
    'product-one' => ['name' => 'Desk 1', 'price' => 100],
    'product-two' => ['name' => 'Desk 2', 'price' => 150],
];

data_get($data, '*.name');


data_set()

Функция data_set устанавливает значение с помощью «точечной нотации» во вложенном массиве или объекте:

$data = ['products' => ['desk' => ['price' => 100]]];

data_set($data, 'products.desk.price', 200);


Допускается использование метасимвола подстановки *:

$data = [
    'products' => [
        ['name' => 'Desk 1', 'price' => 100],
        ['name' => 'Desk 2', 'price' => 150],
    ],
];

data_set($data, 'products.*.price', 200);


По умолчанию все существующие значения перезаписываются. Если вы хотите, чтобы значение было установлено только в том случае, если оно не существует, вы можете передать false в качестве четвертого аргумента:

$data = ['products' => ['desk' => ['price' => 100]]];

data_set($data, 'products.desk.price', 200, $overwrite = false);


head()

Функция head возвращает первый элемент переданного массива:

$array = [100, 200, 300];

$first = head($array);


last()

Функция last возвращает последний элемент переданного массива:

$array = [100, 200, 300];

$last = last($array);


Пути

app_path()

Функция app_path возвращает полный путь к каталогу вашего приложения app. Вы также можете использовать функцию app_path для создания полного пути к файлу относительно каталога приложения:

$path = app_path();

$path = app_path('Http/Controllers/Controller.php');

base_path()

Функция base_path возвращает полный путь к корневому каталогу вашего приложения. Вы также можете использовать функцию base_path для генерации полного пути к заданному файлу относительно корневого каталога проекта:

$path = base_path();

$path = base_path('vendor/bin');

config_path()

Функция config_path возвращает полный путь к каталогу config вашего приложения. Вы также можете использовать функцию config_path для создания полного пути к заданному файлу в каталоге конфигурации приложения:

$path = config_path();

$path = config_path('app.php');

database_path()

Функция database_path возвращает полный путь к каталогу database вашего приложения. Вы также можете использовать функцию database_path для генерации полного пути к заданному файлу в каталоге базы данных:

$path = database_path();

$path = database_path('factories/UserFactory.php');

mix()

Функция mix возвращает путь к версионированному файлу Mix:

$path = mix('css/app.css');

public_path()

Функция public_path возвращает полный путь к каталогу public вашего приложения. Вы также можете использовать функцию public_path для генерации полного пути к заданному файлу в публичном каталоге:

$path = public_path();

$path = public_path('css/app.css');

resource_path()

Функция resource_path возвращает полный путь к каталогу resources вашего приложения. Вы также можете использовать функцию resource_path, чтобы сгенерировать полный путь к заданному файлу в каталоге исходников:

$path = resource_path();

$path = resource_path('sass/app.scss');

storage_path()

Функция storage_path возвращает полный путь к каталогу storage вашего приложения. Вы также можете использовать функцию storage_path для генерации полного пути к заданному файлу в каталоге хранилища:

$path = storage_path();

$path = storage_path('app/file.txt');

Строки

__()

Функция __ переводит переданную строку перевода или ключ перевода, используя ваши файлы локализации:

echo __('Welcome to our application');

echo __('messages.welcome');

Если указанная строка перевода или ключ не существует, то функция __ вернет переданное значение. Итак, используя приведенный выше пример, функция __ вернет messages.welcome, если этот ключ перевода не существует.

class_basename()

Функция class_basename возвращает имя переданного класса с удаленным пространством имен этого класса:

$class = class_basename('Foo\Bar\Baz');


e()

Функция e запускает PHP-функцию htmlspecialchars с параметром double_encode, установленным по умолчанию в true:

echo e('html>foohtml>');

// <html>foo</html>

preg_replace_array()

Функция preg_replace_array последовательно заменяет переданный шаблон в строке, используя массив:

$string = 'The event will take place between :start and :end';

$replaced = preg_replace_array('/:[a-z_]+/', ['8:30', '9:00'], $string);


Str::after()

Метод Str::after возвращает все после переданного значения в строке. Если значение не существует в строке, то будет возвращена вся строка:

use Illuminate\Support\Str;

$slice = Str::after('This is my name', 'This is');


Str::afterLast()

Метод Str::afterLast возвращает все после последнего вхождения переданного значения в строке. Если значение не существует в строке, то будет возвращена вся строка:

use Illuminate\Support\Str;

$slice = Str::afterLast('App\Http\Controllers\Controller', '\\');


Str::ascii()

Метод Str::ascii попытается транслитерировать строку в ASCII значение:

use Illuminate\Support\Str;

$slice = Str::ascii('û');


Str::before()

Метод Str :: before возвращает все до переданного значения в строке:

use Illuminate\Support\Str;

$slice = Str::before('This is my name', 'my name');


Str::beforeLast()

Метод Str::beforeLast возвращает все до последнего вхождения переданного значения в строке:

use Illuminate\Support\Str;

$slice = Str::beforeLast('This is my name', 'is');


Str::between()

Метод Str::between возвращает часть строки между двумя значениями:

use Illuminate\Support\Str;

$slice = Str::between('This is my name', 'This', 'name');


Str::camel()

Метод Str::camel преобразует переданную строку в camelCase:

use Illuminate\Support\Str;

$converted = Str::camel('foo_bar');


Str::contains()

Метод Str::contains определяет, содержит ли переданная строка указанное значение (с учетом регистра):

use Illuminate\Support\Str;

$contains = Str::contains('This is my name', 'my');


Вы также можете указать массив значений, чтобы определить, содержит ли переданная строка какое-либо из значений:

use Illuminate\Support\Str;

$contains = Str::contains('This is my name', ['my', 'foo']);


Str::containsAll()

Метод Str::containsAll определяет, содержит ли переданная строка все значения массива:

use Illuminate\Support\Str;

$containsAll = Str::containsAll('This is my name', ['my', 'name']);


Str::endsWith()

Метод Str::endsWith определяет, заканчивается ли переданная строка указанным значением:

use Illuminate\Support\Str;

$result = Str::endsWith('This is my name', 'name');


Вы также можете указать массив значений, чтобы определить, заканчивается ли переданная строка каким-либо из значений:

use Illuminate\Support\Str;

$result = Str::endsWith('This is my name', ['name', 'foo']);



$result = Str::endsWith('This is my name', ['this', 'foo']);


Str::finish()

Метод Str::finish добавляет один экземпляр указанного значения в переданную строку, если она еще не заканчивается этим значением:

use Illuminate\Support\Str;

$adjusted = Str::finish('this/string', '/');



$adjusted = Str::finish('this/string/', '/');


Str::is()

Метод Str::is определяет, соответствует ли переданная строка указанному шаблону. Допускается использование метасимвола подстановки *:

use Illuminate\Support\Str;

$matches = Str::is('foo*', 'foobar');



$matches = Str::is('baz*', 'foobar');


Str::isAscii()

Метод Str::isAscii определяет, является ли переданная строка 7-битной ASCII:

use Illuminate\Support\Str;

$isAscii = Str::isAscii('Taylor');



$isAscii = Str::isAscii('ü');


Str::isUuid()

Метод Str::isUuid определяет, является ли переданная строка допустимым UUID:

use Illuminate\Support\Str;

$isUuid = Str::isUuid('a0a2a2d2-0b87-4a18-83f2-2529882be2de');



$isUuid = Str::isUuid('laravel');


Str::kebab()

Метод Str::kebab преобразует переданную строку в kebab-case:

use Illuminate\Support\Str;

$converted = Str::kebab('fooBar');


Str::length()

Метод Str::length возвращает длину переданной строки:

use Illuminate\Support\Str;

$length = Str::length('Laravel');


Str::limit()

Метод Str::limit усекает переданную строку до указанной длины:

use Illuminate\Support\Str;

$truncated = Str::limit('The quick brown fox jumps over the lazy dog', 20);


Вы также можете передать третий строковый аргумент, содержимое которого будет добавлено в конец:

use Illuminate\Support\Str;

$truncated = Str::limit('The quick brown fox jumps over the lazy dog', 20, ' (...)');


Str::lower()

Метод Str::lower преобразует переданную строку в нижний регистр:

use Illuminate\Support\Str;

$converted = Str::lower('LARAVEL');


Str::markdown()

Метод Str::markdown конвертирует текст с разметкой GitHub flavored Markdown в HTML:

use Illuminate\Support\Str;

$html = Str::markdown('# Laravel');



$html = Str::markdown('# Taylor Otwell', [
    'html_input' => 'strip',
]);


Str::orderedUuid()

Метод Str::orderedUuid генерирует UUID с «префиксом временной метки», который может быть эффективно сохранен в индексированном столбце базы данных. Каждый UUID, созданный с помощью этого метода, будет отсортирован после UUID, ранее созданных с помощью этого метода:

use Illuminate\Support\Str;

return (string) Str::orderedUuid();

Str::padBoth()

Метод Str::padBoth оборачивает функцию str_pad PHP, заполняя обе стороны строки другой строкой, пока конечная строка не достигнет желаемой длины:

use Illuminate\Support\Str;

$padded = Str::padBoth('James', 10, '_');



$padded = Str::padBoth('James', 10);


Str::padLeft()

Метод Str::padLeft оборачивает функцию str_pad PHP, заполняя левую часть строки другой строкой, пока конечная строка не достигнет желаемой длины:

use Illuminate\Support\Str;

$padded = Str::padLeft('James', 10, '-=');



$padded = Str::padLeft('James', 10);


Str::padRight()

Метод Str::padRight оборачивает функцию str_pad PHP, заполняя правую часть строки другой строкой, пока конечная строка не достигнет желаемой длины:

use Illuminate\Support\Str;

$padded = Str::padRight('James', 10, '-');



$padded = Str::padRight('James', 10);


Str::plural()

Метод Str::plural преобразует слово в форму множественного числа. В настоящее время этот метод поддерживает только английский язык:

use Illuminate\Support\Str;

$plural = Str::plural('car');



$plural = Str::plural('child');


Вы можете передать целое число в качестве второго аргумента метода для получения строки в единственном или множественном числе:

use Illuminate\Support\Str;

$plural = Str::plural('child', 2);



$singular = Str::plural('child', 1);


Str::pluralStudly()

Метод Str::pluralStudly преобразует строку единственного числа формата StudlyCase в форму множественного числа. В настоящее время этот метод поддерживает только английский язык:

use Illuminate\Support\Str;

$plural = Str::pluralStudly('VerifiedHuman');



$plural = Str::pluralStudly('UserFeedback');


Вы можете передать целое число в качестве второго аргумента метода для получения строки в единственном или множественном числе:

use Illuminate\Support\Str;

$plural = Str::pluralStudly('VerifiedHuman', 2);



$singular = Str::pluralStudly('VerifiedHuman', 1);


Str::random()

Метод Str::random генерирует случайную строку указанной длины. Этот метод использует функцию random_bytes PHP:

use Illuminate\Support\Str;

$random = Str::random(40);

Str::remove()

Метод Str::remove удаляет указанную подстроку или массив подстрок в строке:

use Illuminate\Support\Str;

$string = 'Peter Piper picked a peck of pickled peppers.';

$removed = Str::remove('e', $string);


Вы можете передать false в качестве третьего аргумента для игнорирования регистра удаляемых подстрок.

Str::replace()

Метод Str::replace заменяет в строке одну подстроку другой:

use Illuminate\Support\Str;

$string = 'Laravel 8.x';

$replaced = Str::replace('8.x', '9.x', $string);


Str::replaceArray()

Метод Str::replaceArray последовательно заменяет указанное значение в строке, используя массив:

use Illuminate\Support\Str;

$string = 'The event will take place between ? and ?';

$replaced = Str::replaceArray('?', ['8:30', '9:00'], $string);


Str::replaceFirst()

Метод Str::replaceFirst заменяет первое вхождение переданного значения в строке:

use Illuminate\Support\Str;

$replaced = Str::replaceFirst('the', 'a', 'the quick brown fox jumps over the lazy dog');


Str::replaceLast()

Метод Str::replaceLast заменяет последнее вхождение переданного значения в строке:

use Illuminate\Support\Str;

$replaced = Str::replaceLast('the', 'a', 'the quick brown fox jumps over the lazy dog');


Str::singular()

Метод Str::singular преобразует слово в форму единственного числа. В настоящее время этот метод поддерживает только английский язык:

use Illuminate\Support\Str;

$singular = Str::singular('cars');



$singular = Str::singular('children');


Str::slug()

Метод Str::slug создает «дружественный фрагмент» URL-адреса из переданной строки:

use Illuminate\Support\Str;

$slug = Str::slug('Laravel 5 Framework', '-');


Str::snake()

Метод Str::snake преобразует переданную строку в snake_case:

use Illuminate\Support\Str;

$converted = Str::snake('fooBar');


Str::start()

Метод Str::start добавляет один экземпляр указанного значения в переданную строку, если она еще не начинается этим значением:

use Illuminate\Support\Str;

$adjusted = Str::start('this/string', '/');



$adjusted = Str::start('/this/string', '/');


Str::startsWith()

Метод Str::startsWith определяет, начинается ли переданная строка с указанного значения:

use Illuminate\Support\Str;

$result = Str::startsWith('This is my name', 'This');


Str::studly()

Метод Str::studly преобразует переданную строку в StudlyCase:

use Illuminate\Support\Str;

$converted = Str::studly('foo_bar');


Str::substr()

Метод Str::substr возвращает часть строки, заданную параметрами «начало» и «длина»:

use Illuminate\Support\Str;

$converted = Str::substr('The Laravel Framework', 4, 7);


Str::substrCount()

Метод Str::substrCount возвращает число вхождений подстроки в строку:

use Illuminate\Support\Str;

$count = Str::substrCount('If you like ice cream, you will like snow cones.', 'like');


Str::title()

Метод Str::title преобразует переданную строку в Title Case:

use Illuminate\Support\Str;

$converted = Str::title('a nice title uses the correct case');


Str::ucfirst()

Метод Str::ucfirst возвращает переданную строку с первой заглавной буквой:

use Illuminate\Support\Str;

$string = Str::ucfirst('foo bar');


Str::upper()

Метод Str::upper преобразует переданную строку в верхний регистр:

use Illuminate\Support\Str;

$string = Str::upper('laravel');


Str::uuid()

Метод Str::uuid генерирует UUID (версия 4):

use Illuminate\Support\Str;

return (string) Str::uuid();

wordCount

Метод wordCount возвращает число слов в строке:

use Illuminate\Support\Str;

Str::wordCount('Hello, world!'); 

Str::words()

Метод Str::words ограничивает количество слов в строке. Дополнительная строка может быть передана этому методу через его третий аргумент, чтобы указать, какая строка должна быть добавлена в конец усеченной строки:

use Illuminate\Support\Str;

return Str::words('Perfectly balanced, as all things should be.', 3, ' >>>');


trans()

Функция trans переводит переданный ключ перевода, используя ваши файлы локализации:

echo trans('messages.welcome');

Если указанный ключ перевода не существует, функция trans вернет данный ключ. Итак, используя приведенный выше пример, функция trans вернет messages.welcome, если ключ перевода не существует.

trans_choice()

Функция trans_choice переводит заданный ключ перевода с изменением формы слова:

echo trans_choice('messages.notifications', $unreadCount);

Если указанный ключ перевода не существует, функция trans_choice вернет данный ключ. Итак, используя приведенный выше пример, функция trans_choice вернет messages.notifications, если ключ перевода не существует.

Строки Fluent

Строки Fluent обеспечивают более гибкий объектно-ориентированный интерфейс для работы со строковыми значениями, позволяя объединять несколько строковых операций вместе с использованием более удобочитаемого синтаксиса по сравнению с традиционными строковыми операциями.

after

Метод after возвращает все после переданного значения в строке. Вся строка будет возвращена, если значение не существует в строке:

use Illuminate\Support\Str;

$slice = Str::of('This is my name')->after('This is');


afterLast

Метод afterLast возвращает все после последнего вхождения переданного значения в строке. Вся строка будет возвращена, если значение не существует в строке:

use Illuminate\Support\Str;

$slice = Str::of('App\Http\Controllers\Controller')->afterLast('\\');


append

Метод append добавляет указанные значения в строку:

use Illuminate\Support\Str;

$string = Str::of('Taylor')->append(' Otwell');


ascii

Метод ascii попытается транслитерировать строку в значение ASCII:

use Illuminate\Support\Str;

$string = Str::of('ü')->ascii();


basename

Метод basename вернет завершающий компонент имени переданной строки:

use Illuminate\Support\Str;

$string = Str::of('/foo/bar/baz')->basename();


При необходимости вы можете указать «расширение», которое будет удалено из завершающего компонента:

use Illuminate\Support\Str;

$string = Str::of('/foo/bar/baz.jpg')->basename('.jpg');


before

Метод before возвращает все до указанного значения в строке:

use Illuminate\Support\Str;

$slice = Str::of('This is my name')->before('my name');


beforeLast

Метод beforeLast возвращает все до последнего вхождения переданного значения в строку:

use Illuminate\Support\Str;

$slice = Str::of('This is my name')->beforeLast('is');


camel

Метод camel преобразует переданную строку в camelCase:

use Illuminate\Support\Str;

$converted = Str::of('foo_bar')->camel();


contains

Метод contains определяет, содержит ли переданная строка указанное значение (с учетом регистра):

use Illuminate\Support\Str;

$contains = Str::of('This is my name')->contains('my');


Вы также можете указать массив значений, чтобы определить, содержит ли переданная строка какое-либо из этих значений:

use Illuminate\Support\Str;

$contains = Str::of('This is my name')->contains(['my', 'foo']);


containsAll

Метод containsAll определяет, содержит ли переданная строка все значения массива:

use Illuminate\Support\Str;

$containsAll = Str::of('This is my name')->containsAll(['my', 'name']);


dirname

Метод dirname возвращает родительскую часть директории переданной строки:

use Illuminate\Support\Str;

$string = Str::of('/foo/bar/baz')->dirname();


При желании вы можете указать, сколько уровней каталогов вы хотите вырезать из строки:

use Illuminate\Support\Str;

$string = Str::of('/foo/bar/baz')->dirname(2);


endsWith

Метод endsWith определяет, заканчивается ли переданная строка указанным значением:

use Illuminate\Support\Str;

$result = Str::of('This is my name')->endsWith('name');


Вы также можете указать массив значений, чтобы определить, заканчивается ли переданная строка каким-либо из указанных значений:

use Illuminate\Support\Str;

$result = Str::of('This is my name')->endsWith(['name', 'foo']);



$result = Str::of('This is my name')->endsWith(['this', 'foo']);


exactly

Метод exactly определяет, является ли переданная строка точным совпадением с другой строкой:

use Illuminate\Support\Str;

$result = Str::of('Laravel')->exactly('Laravel');


explode

Метод explode разделяет строку по заданному разделителю и возвращает коллекцию, содержащую каждый раздел строки разбиения:

use Illuminate\Support\Str;

$collection = Str::of('foo bar baz')->explode(' ');


finish

Метод finish добавляет один экземпляр указанного значения в переданную строку, если она еще не заканчивается этим значением:

use Illuminate\Support\Str;

$adjusted = Str::of('this/string')->finish('/');



$adjusted = Str::of('this/string/')->finish('/');


is

Метод is определяет, соответствует ли переданная строка указанному шаблону. Допускается использование метасимвола подстановки *:

use Illuminate\Support\Str;

$matches = Str::of('foobar')->is('foo*');



$matches = Str::of('foobar')->is('baz*');


isAscii

Метод isAscii определяет, является ли переданная строка строкой ASCII:

use Illuminate\Support\Str;

$result = Str::of('Taylor')->isAscii();



$result = Str::of('ü')->isAscii();


isEmpty

Метод isEmpty определяет, является ли переданная строка пустой:

use Illuminate\Support\Str;

$result = Str::of('  ')->trim()->isEmpty();



$result = Str::of('Laravel')->trim()->isEmpty();


isNotEmpty

Метод isNotEmpty определяет, является ли переданная строка не пустой:

use Illuminate\Support\Str;

$result = Str::of('  ')->trim()->isNotEmpty();



$result = Str::of('Laravel')->trim()->isNotEmpty();


kebab

Метод kebab преобразует переданную строку в kebab-case:

use Illuminate\Support\Str;

$converted = Str::of('fooBar')->kebab();


length

Метод length возвращает длину переданной строки:

use Illuminate\Support\Str;

$length = Str::of('Laravel')->length();


limit

Метод limit усекает переданную строку до указанной длины:

use Illuminate\Support\Str;

$truncated = Str::of('The quick brown fox jumps over the lazy dog')->limit(20);


Вы также можете передать второй строковый аргумент, содержимое которого будет добавлено в конец:

use Illuminate\Support\Str;

$truncated = Str::of('The quick brown fox jumps over the lazy dog')->limit(20, ' (...)');


lower

Метод lower преобразует переданную строку в нижний регистр:

use Illuminate\Support\Str;

$result = Str::of('LARAVEL')->lower();


ltrim

Метод ltrim удаляет символы из начала строки:

use Illuminate\Support\Str;

$string = Str::of('  Laravel  ')->ltrim();



$string = Str::of('/Laravel/')->ltrim('/');


markdown

Метод markdown конвертирует текст с разметкой GitHub flavored Markdown в HTML:

use Illuminate\Support\Str;

$html = Str::of('# Laravel')->markdown();



$html = Str::of('# Taylor Otwell')->markdown([
    'html_input' => 'strip',
]);


match

Метод match вернет часть строки, которая соответствует указанному шаблону регулярного выражения:

use Illuminate\Support\Str;

$result = Str::of('foo bar')->match('/bar/');



$result = Str::of('foo bar')->match('/foo (.*)/');


matchAll

Метод matchAll вернет коллекцию, содержащую части строки, которые соответствуют указанному шаблону регулярного выражения:

use Illuminate\Support\Str;

$result = Str::of('bar foo bar')->matchAll('/bar/');


Если вы укажете группировку в выражении, то Laravel вернет коллекцию совпадений этой группы:

use Illuminate\Support\Str;

$result = Str::of('bar fun bar fly')->matchAll('/f(\w*)/');


If no matches are found, an empty collection will be returned.

padBoth

Метод padBoth оборачивает функцию str_pad PHP, заполняя обе стороны строки другой строкой, пока конечная строка не достигнет желаемой длины:

use Illuminate\Support\Str;

$padded = Str::of('James')->padBoth(10, '_');



$padded = Str::of('James')->padBoth(10);


padLeft

Метод padLeft оборачивает функцию str_pad PHP, заполняя левую часть строки другой строкой, пока конечная строка не достигнет желаемой длины:

use Illuminate\Support\Str;

$padded = Str::of('James')->padLeft(10, '-=');



$padded = Str::of('James')->padLeft(10);


padRight

Метод padRight оборачивает функцию str_pad PHP, заполняя правую часть строки другой строкой, пока конечная строка не достигнет желаемой длины:

use Illuminate\Support\Str;

$padded = Str::of('James')->padRight(10, '-');



$padded = Str::of('James')->padRight(10);


pipe

Метод pipe позволяет вам преобразовать строку, передав ее текущее значение указанной функции обратного вызова:

use Illuminate\Support\Str;

$hash = Str::of('Laravel')->pipe('md5')->prepend('Checksum: ');



$closure = Str::of('foo')->pipe(function ($str) {
    return 'bar';
});


plural

Метод plural преобразует слово в форму множественного числа. В настоящее время этот метод поддерживает только английский язык:

use Illuminate\Support\Str;

$plural = Str::of('car')->plural();



$plural = Str::of('child')->plural();


Вы можете передать целое число в качестве второго аргумента метода для получения строки в единственном или множественном числе:

use Illuminate\Support\Str;

$plural = Str::of('child')->plural(2);



$plural = Str::of('child')->plural(1);


prepend

Метод prepend добавляет указанные значения в начало строки:

use Illuminate\Support\Str;

$string = Str::of('Framework')->prepend('Laravel ');


remove

Метод remove удаляет указанную подстроку или массив подстрок в строке:

use Illuminate\Support\Str;

$string = Str::of('Arkansas is quite beautiful!')->remove('quite');


Вы можете передать false в качестве второго аргумента для игнорирования регистра удаляемых подстрок.

replace

Метод replace заменяет указанную строку внутри строки:

use Illuminate\Support\Str;

$replaced = Str::of('Laravel 6.x')->replace('6.x', '7.x');


replaceArray

Метод replaceArray последовательно заменяет указанное значение в строке, используя массив:

use Illuminate\Support\Str;

$string = 'The event will take place between ? and ?';

$replaced = Str::of($string)->replaceArray('?', ['8:30', '9:00']);


replaceFirst

Метод replaceFirst заменяет первое вхождение указанного значения в строке:

use Illuminate\Support\Str;

$replaced = Str::of('the quick brown fox jumps over the lazy dog')->replaceFirst('the', 'a');


replaceLast

Метод replaceLast заменяет последнее вхождение указанного значения в строке:

use Illuminate\Support\Str;

$replaced = Str::of('the quick brown fox jumps over the lazy dog')->replaceLast('the', 'a');


replaceMatches

Метод replaceMatches заменяет все части строки, соответствующие указанному шаблону, переданной строки:

use Illuminate\Support\Str;

$replaced = Str::of('(+1) 501-555-1000')->replaceMatches('/[^A-Za-z0-9]++/', '')


Метод replaceMatches также принимает замыкание, которое будет вызвано для каждой части строки, соответствующей шаблону, что позволяет вам выполнять логику замены в замыкании и возвращать замененное значение:

use Illuminate\Support\Str;

$replaced = Str::of('123')->replaceMatches('/\d/', function ($match) {
    return '['.$match[0].']';
});


rtrim

Метод rtrim удаляет символы из конца строки:

use Illuminate\Support\Str;

$string = Str::of('  Laravel  ')->rtrim();



$string = Str::of('/Laravel/')->rtrim('/');


singular

Метод singular преобразует слово в форму единственного числа. В настоящее время этот метод поддерживает только английский язык:

use Illuminate\Support\Str;

$singular = Str::of('cars')->singular();



$singular = Str::of('children')->singular();


slug

Метод slug создает «дружественный фрагмент» URL-адреса из переданной строки:

use Illuminate\Support\Str;

$slug = Str::of('Laravel Framework')->slug('-');


snake

Метод snake преобразует переданную строку в snake_case:

use Illuminate\Support\Str;

$converted = Str::of('fooBar')->snake();


split

Метод split разбивает строку на коллекцию с помощью регулярного выражения:

use Illuminate\Support\Str;

$segments = Str::of('one, two, three')->split('/[\s,]+/');


start

Метод start добавляет один экземпляр указанного значения в переданную строку, если она еще не начинается этим значением:

use Illuminate\Support\Str;

$adjusted = Str::of('this/string')->start('/');



$adjusted = Str::of('/this/string')->start('/');


startsWith

Метод startsWith определяет, начинается ли переданная строка с указанного значения:

use Illuminate\Support\Str;

$result = Str::of('This is my name')->startsWith('This');


studly

Метод studly преобразует переданную строку в StudlyCase:

use Illuminate\Support\Str;

$converted = Str::of('foo_bar')->studly();


substr

Метод substr возвращает часть строки, заданную параметрами «начало» и «длина»:

use Illuminate\Support\Str;

$string = Str::of('Laravel Framework')->substr(8);



$string = Str::of('Laravel Framework')->substr(8, 5);


tap

Метод tap передает строку заданному замыканию, позволяя вам взаимодействовать с ней, не затрагивая при этом саму строку. Исходная строка возвращается методом tap независимо от того, что возвращает замыкание:

use Illuminate\Support\Str;

$string = Str::of('Laravel')
    ->append(' Framework')
    ->tap(function ($string) {
        dump('String after append: ' . $string);
    })
    ->upper();


test

Метод test определяет, соответствует ли строка переданному шаблону регулярного выражения:

use Illuminate\Support\Str;

$result = Str::of('Laravel Framework')->test('/Laravel/');


title

Метод title преобразует переданную строку в Title Case:

use Illuminate\Support\Str;

$converted = Str::of('a nice title uses the correct case')->title();


trim

Метод trim обрезает переданную строку:

use Illuminate\Support\Str;

$string = Str::of('  Laravel  ')->trim();



$string = Str::of('/Laravel/')->trim('/');


ucfirst

Метод ucfirst возвращает переданную строку с первой заглавной буквой:

use Illuminate\Support\Str;

$string = Str::of('foo bar')->ucfirst();


upper

Метод upper преобразует переданную строку в верхний регистр:

use Illuminate\Support\Str;

$adjusted = Str::of('laravel')->upper();


when

Метод when вызывает указанное замыкание, если переданное условие истинно. Замыкание получит экземпляр Fluent:

use Illuminate\Support\Str;

$string = Str::of('Taylor')
                ->when(true, function ($string) {
                    return $string->append(' Otwell');
                });


При необходимости вы можете передать другое замыкание в качестве третьего параметра методу when. Это замыкание будет выполнено, если параметр условия оценивается как false.

whenEmpty

Метод whenEmpty вызывает переданное замыкание, если строка пуста. Если замыкание возвращает значение, то это значение будет возвращено методом whenEmpty. Если замыкание не возвращает значение, будет возвращен экземпляр Fluent:

use Illuminate\Support\Str;

$string = Str::of('  ')->whenEmpty(function ($string) {
    return $string->trim()->prepend('Laravel');
});


wordCount

Метод wordCount возвращает число слов в строке:

use Illuminate\Support\Str;

Str::of('Hello, world!')->wordCount(); 

words

Метод words ограничивает количество слов в строке. Дополнительная строка может быть передана этому методу, чтобы указать, какая строка должна быть добавлена в конец усеченной строки:

use Illuminate\Support\Str;

$string = Str::of('Perfectly balanced, as all things should be.')->words(3, ' >>>');


URL-адреса

action()

Функция action генерирует URL-адрес для переданного действия контроллера:

use App\Http\Controllers\HomeController;

$url = action([HomeController::class, 'index']);

Если метод принимает параметры маршрута, вы можете передать их как второй аргумент методу:

$url = action([UserController::class, 'profile'], ['id' => 1]);

asset()

Функция asset генерирует URL для исходника (прим. перев.: директория resources), используя текущую схему запроса (HTTP или HTTPS):

$url = asset('img/photo.jpg');

Вы можете настроить хост URL исходников, установив переменную ASSET_URL в вашем файле .env. Это может быть полезно, если вы размещаете свои исходники на внешнем сервисе, таком как Amazon S3 или другой CDN:



$url = asset('img/photo.jpg'); 

route()

Функция route генерирует URL для переданного именованного маршрута:

$url = route('route.name');

Если маршрут принимает параметры, вы можете передать их в качестве второго аргумента методу:

$url = route('route.name', ['id' => 1]);

По умолчанию функция route генерирует абсолютный URL. Если вы хотите создать относительный URL, вы можете передать false в качестве третьего аргумента:

$url = route('route.name', ['id' => 1], false);

secure_asset()

Функция secure_asset генерирует URL для исходника, используя HTTPS:

$url = secure_asset('img/photo.jpg');

secure_url()

Функция secure_url генерирует полный URL-адрес для указанного пути, используя HTTPS. Дополнительные сегменты URL могут быть переданы во втором аргументе функции:

$url = secure_url('user/profile');

$url = secure_url('user/profile', [1]);

url()

Функция url генерирует полный URL-адрес для указанного пути:

$url = url('user/profile');

$url = url('user/profile', [1]);

Если путь не указан, будет возвращен экземпляр Illuminate\Routing\UrlGenerator:

$current = url()->current();

$full = url()->full();

$previous = url()->previous();

map

Преобразовывает пары ключ:значение в тип данных Map(key, value).

Синтаксис

map(key1, value1[, key2, value2, ...])

Аргументы

  • key — ключ. String или Integer.
  • value — значение. String, Integer или Array.

Возвращаемое значение

  • Структура данных в виде пар ключ:значение.

Тип: Map(key, value).

Примеры

Запрос:

SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);

Результат:

┌─map('key1', number, 'key2', multiply(number, 2))─┐
│ {'key1':0,'key2':0}                              │
│ {'key1':1,'key2':2}                              │
│ {'key1':2,'key2':4}                              │
└──────────────────────────────────────────────────┘

Запрос:

CREATE TABLE table_map (a Map(String, UInt64)) ENGINE = MergeTree() ORDER BY a;
INSERT INTO table_map SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);
SELECT a['key2'] FROM table_map;

Результат:

┌─arrayElement(a, 'key2')─┐
│                       0 │
│                       2 │
│                       4 │
└─────────────────────────┘

Смотрите также

  • тип данных Map(key, value)

mapAdd

Собирает все ключи и суммирует соответствующие значения.

Синтаксис

mapAdd(Tuple(Array, Array), Tuple(Array, Array) [, ...])

Аргументы

Аргументами являются кортежи из двух массивов, где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа.
Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу (Int64, UInt64 или Float64).
Общий приведенный тип используется в качестве типа для результирующего массива.

Возвращаемое значение

  • Возвращает один кортеж, в котором первый массив содержит отсортированные ключи, а второй — значения.

Пример

Запрос:

SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTypeName(res) as type;

Результат:

┌─res───────────┬─type───────────────────────────────┐
│ ([1,2],[2,2]) │ Tuple(Array(UInt8), Array(UInt64)) │
└───────────────┴────────────────────────────────────┘

mapSubtract

Собирает все ключи и вычитает соответствующие значения.

Синтаксис

mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...])

Аргументы

Аргументами являются кортежи из двух массивов, где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа.
Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу (Int64, UInt64 или Float64).
Общий приведенный тип используется в качестве типа для результирующего массива.

Возвращаемое значение

  • Возвращает один tuple, в котором первый массив содержит отсортированные ключи, а второй - значения.

Пример

Запрос:

SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1])) as res, toTypeName(res) as type;

Результат:

┌─res────────────┬─type──────────────────────────────┐
│ ([1,2],[-1,0]) │ Tuple(Array(UInt8), Array(Int64)) │
└────────────────┴───────────────────────────────────┘

mapPopulateSeries

Заполняет недостающие ключи в контейнере map (пара массивов ключей и значений), где ключи являются целыми числами. Кроме того, он поддерживает указание максимального ключа, который используется для расширения массива ключей.

Синтаксис

mapPopulateSeries(keys, values[, max])

Генерирует контейнер map, где ключи - это серия чисел, от минимального до максимального ключа (или аргумент max, если он указан), взятых из массива keys с размером шага один, и соответствующие значения, взятые из массива values. Если значение не указано для ключа, то в результирующем контейнере используется значение по умолчанию.

Количество элементов в keys и values должно быть одинаковым для каждой строки.

Аргументы

  • keys — массив ключей Array(Int).
  • values — массив значений. Array(Int).

Возвращаемое значение

  • Возвращает кортеж из двух массивов: ключи отсортированные по порядку и значения соответствующих ключей.

Пример

Запрос:

select mapPopulateSeries([1,2,4], [11,22,44], 5) as res, toTypeName(res) as type;

Результат:

┌─res──────────────────────────┬─type──────────────────────────────┐
│ ([1,2,3,4,5],[11,22,0,44,0]) │ Tuple(Array(UInt8), Array(UInt8)) │
└──────────────────────────────┴───────────────────────────────────┘

mapContains

Определяет, содержит ли контейнер map ключ key.

Синтаксис

Аргументы

  • map — контейнер Map. Map.
  • key — ключ. Тип соответстует типу ключей параметра map.

Возвращаемое значение

  • 1 если map включает key, иначе 0.

Тип: UInt8.

Пример

Запрос:

CREATE TABLE test (a Map(String,String)) ENGINE = Memory;

INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});

SELECT mapContains(a, 'name') FROM test;

Результат:

┌─mapContains(a, 'name')─┐
│                      1 │
│                      0 │
└────────────────────────┘

mapKeys

Возвращает все ключи контейнера map.

Функцию можно оптимизировать, если включить настройку optimize_functions_to_subcolumns. При optimize_functions_to_subcolumns = 1 функция читает только подстолбец keys вместо чтения и обработки данных всего столбца. Запрос SELECT mapKeys(m) FROM table преобразуется к запросу SELECT m.keys FROM table.

Синтаксис

Аргументы

  • map — контейнер Map. Map.

Возвращаемое значение

  • Массив со всеми ключами контейнера map.

Тип: Array.

Пример

Запрос:

CREATE TABLE test (a Map(String,String)) ENGINE = Memory;

INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});

SELECT mapKeys(a) FROM test;

Результат:

┌─mapKeys(a)────────────┐
│ ['name','age']        │
│ ['number','position'] │
└───────────────────────┘

Простой пример рекурсии в PHP

Ниже показан примитивный пример использования рекурсии. По сути, ничего полезного данный код не делает. Более того, такой скрипт (бесконечный) переполнит стэк и аварийно завершит свою работу. Мы получим ошибку: Fatal error: Uncaught Error: Maximum function nesting level of '256' reached, aborting!.

 function recursion() 
 {    
  recursion(); 
 }

  recursion();

Факториал

Чтобы избавится от бесполезного и бесконечного вызова функции, необходимо прописать условие при котором эта функция вызывала бы сама себя, делая при этом что-то полезное и нужное. В классическом исполнение хорошо подходит пример функции вычисляющей факториал числа.

Факториал - произведение всех целых чисел, меньших или равных данному числу.
function factorial($n) 
{
 if ($n 

Факториал числа так же можно вычислить, применив цикл, полностью заменяющий рекурсию:

function factorial($n) 
{
 $result = 1; 
 for ($i = 1; $i 


Пример функции для защиты от XSS

Практически все данные (за редким исключением) из форм необходимо, во избежания XSS, пропускать через функцию htmlspecialchars(). Наша задача написать такую функцию, которая будет принимать массив (включая вложенные массивы) всех входящих данных и "прогонять" эти данные через встроенную функцию php htmlspecialchars(). И как раз здесь мы будем использовать рекурсию.

 $value) { // Перебираем исходный массив
  	$result[$key] = xss($value); // Рекурсивно вызываем функцию xss
  }
  return $result; // Возвращаемый "защищённый" массив
 }
 return htmlspecialchars($data, ENT_QUOTES); // Если это не массив, то вызываем htmlspecialchars()
}


// Предположим, что в строке запроса у нас такая строка:
// /?name=John&age=45
$data = xss($_REQUEST); // Вызываем функцию, передав туда в качестве аргумента весь REQUEST

// Распечатаем результат
var_dump($data);