Выпуск PHP 8.4 запланирован на ноябрь 2024 г., и в нем появятся несколько удобных новых функций работы с массивами:
В этой статье мы кратко рассмотрим эти новые функции и то, как вы сможете использовать их в своих проектах под управлением PHP 8.4.
Если вы разработчик Laravel, вы могли заметить, что у нас уже есть похожие функции в классах Illuminate\Support\Collection и Illuminate\Support\Arr. Но мне нравится, что эти функции будут встроенными в PHP и поэтому будут доступны в любом проекте PHP.
Для всех моих читателей, которые являются разработчиками Laravel, я покажу вам эквиваленты этих новых функций в Laravel, чтобы вы могли добиться той же функциональности в своих проектах Laravel, не дожидаясь PHP 8.4.
Возможно, вам также будет интересно прочитать другую мою статью, в которой рассказывается о новой функции «перехватчиков свойств» PHP 8.4.
Функция array_find возвращает значение первого элемента, соответствующего критериям, определенным в обратном вызове. Если ни один элемент не соответствует обратному вызову, функция возвращает значение null.
Давайте рассмотрим простой пример. Предположим, у нас есть массив продуктов и мы хотим найти продукт по штрих-коду 123456:
$products = [ [ 'name' => 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ], [ 'name' => 'Framework Laptop 13', 'type' => 'Laptop', 'barcode' => 789012, ], [ 'name' => 'Samsung Galaxy S24', 'type' => 'Phone', 'barcode' => 135791, ], ]; // Find the product with barcode 123456 $findProduct = array_find( array: $products, callback: function (array $product): bool { return $product['barcode'] == 123456; }, );
После запуска приведенного выше кода $findProduct будет равен:
[ 'name'=> 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ]
Мы могли бы немного упростить ситуацию, используя стрелочную функцию в качестве второго аргумента:
$findProduct = array_find( array: $products, callback: fn (array $product): bool => $product['barcode'] === 123456, );
Приведенный выше код вернет тот же результат, что и предыдущий пример.
Если ни один элемент не соответствует обратному вызову, функция вернет значение null. Давайте посмотрим на пример:
$nonExistentProduct = array_find( array: $products, callback: fn (array $product): bool => $product['barcode'] === 'invalid', );
В этом случае $nonExistentProduct будет равен нулю.
В Laravel аналогичного результата можно добиться, используя метод Arr::first:
use Illuminate\Support\Arr; $findProduct = Arr::first( $products, fn (array $product): bool => $product['barcode'] === 123456, );
Эта функция аналогична функции array_find, но вместо возврата значения первого элемента, соответствующего обратному вызову, она возвращает ключ первого элемента, соответствующего обратному вызову.
Давайте возьмем наш пример массива $products, приведенный ранее. На этот раз мы хотим найти ключ продукта со штрих-кодом 789012:
$products = [ [ 'name' => 'Macbook Pro', 'type' => 'Laptop', 'barcode' => 123456, ], [ 'name' => 'Framework Laptop 13', 'type' => 'Laptop', 'barcode' => 789012, ], [ 'name' => 'Samsung Galaxy S24', 'type' => 'Phone', 'barcode' => 135791, ], ]; // Find the key of the product with barcode 789012 $findProduct = array_find_key( array: $products, callback: fn (array $product): bool => $product['barcode'] === 789012, );
После выполнения приведенного выше кода $findProduct будет равен 1, поскольку произведение является вторым элементом массива.
Если ни один элемент не соответствует обратному вызову, функция вернет значение null. Давайте посмотрим на пример:
$nonExistentProduct = array_find_key( array: $products, callback: fn (array $product): bool => $product['barcode'] === 'invalid', );
В этом случае $nonExistentProduct будет равен нулю.
В Laravel аналогичного результата можно добиться, используя комбинацию методов array_keys и Arr::first:
use Illuminate\Support\Arr; $firstProductKey = Arr::first( array_keys($products), fn (int $key): bool => $products[$key]['barcode'] === 789012, );
В приведенном выше коде мы сначала используем array_keys для получения массива ключей массива $products. Затем мы используем Arr::first, чтобы найти первый ключ, соответствующий обратному вызову. Это немного более подробно, чем встроенная функция PHP, но дает тот же результат.
Функция array_any позволяет вам проверить, что хотя бы один элемент массива соответствует критериям, определенным в обратном вызове. Если какой-либо элемент соответствует обратному вызову, функция возвращает true. Если ни один элемент не соответствует обратному вызову, функция возвращает false.
Используя наш пример массива $products, давайте проверим, имеет ли какой-либо из продуктов тип ноутбука:
$anyProductsAreLaptops = array_any( array: $products, callback: fn (array $product): bool => $product['type'] === 'Laptop', );
В этом случае $anyProductsAreLaptops будет равна true, поскольку хотя бы один из продуктов в массиве — ноутбук.
Если ни один элемент не соответствует обратному вызову, функция вернет false. Давайте посмотрим на пример:
$anyProductsAreInvalid = array_any( array: $products, callback: fn (array $product): bool => $product['type'] === 'Invalid', );
В этом случае $anyProductsAreInvalid будет иметь значение false.
Мы можем добиться того же результата в Laravel, используя метод contains для коллекции:
use Illuminate\Support\Collection; $anyProductsAreLaptops = Collection::make($products)->contains( fn (array $product): bool => $product['type'] === 'Laptop', );
В приведенном выше коде мы создаем коллекцию из массива $products, а затем с помощью метода contains проверяем, являются ли какие-либо продукты в коллекции ноутбуками.
Функция array_all аналогична функции array_any, но вместо проверки того, соответствует ли хотя бы один элемент обратному вызову, она проверяет, соответствуют ли все элементы обратному вызову. Если все элементы соответствуют обратному вызову, функция возвращает true. Если какой-либо элемент не соответствует обратному вызову, функция возвращает false.
Давайте проверим, все ли продукты в нашем массиве $products являются ноутбуками:
$allProductsAreLaptops = array_all( array: $products, callback: fn (array $product): bool => $product['type'] === 'Laptop', );
В этом случае $allProductsAreLaptops будет иметь значение false, поскольку не все продукты в массиве являются ноутбуками.
В Laravel мы можем добиться того же результата, используя каждый метод в коллекции:
use Illuminate\Support\Collection; $allProductsAreLaptops = Collection::make($products)->every( fn (array $product): bool => $product['type'] === 'Laptop', );
В приведенном выше коде мы создаем коллекцию из массива $products, а затем с помощью каждого метода проверяем, все ли продукты в коллекции являются ноутбуками.
Надеюсь, эта статья показала вам, как можно использовать новые функции работы с массивами, которые будут доступны в PHP 8.4. Это также должно было дать вам представление о том, как можно добиться аналогичной функциональности в Laravel, используя классы Illuminate\Support\Collection и Illuminate\Support\Arr.
Если вам понравилось читать этот пост, возможно, вам будет интересно ознакомиться с моей 220-страничной электронной книгой «Battle Ready Laravel», в которой подобные темы рассматриваются более подробно.
Или вы можете ознакомиться с моей другой 440-страничной электронной книгой «Использование API в Laravel», в которой вы узнаете, как использовать Laravel для использования API из других сервисов.
Если вы хотите получать обновления каждый раз, когда я публикую новую публикацию, подпишитесь на мою рассылку.
Продолжайте создавать потрясающие вещи! ?
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3