PHP 8.4: Новые функции поиска в массиве. Пишем с нуля

от автора

В PHP 8.4 планируется добавить новые функции массива: array_find, array_find_key, array_any и array_all, которые являются вспомогательными функциями для общих шаблонов проверки массива на наличие элементов, соответствующих определенному условию.

В настоящее время существует несколько функций, обрабатывающих массивы с использованием обратного вызова. Однако по-прежнему отсутствуют функции для поиска отдельного элемента, соответствующего условию, и тесно связанные функции проверки наличия элементов, соответствующих условию. Реализовать эти функции в среде пользователей относительно просто, но они часто требуются, что приводит к тому, что колесо изобретается снова и снова. Кроме того, функции такого типа реализованы и в других языках программирования, таких как Rust, JavaScript или C++. Поэтому есть причина включить эти функции в стандартную комплектацию следующей версии PHP. Кроме того, реализация этих функций очень похожа на array_filter и относительно проста в реализации, поэтому затраты на обслуживание должны быть низкими.

array_find

array_find возвращает значение первого элемента, для которого функция $callback возвращает значение true. Если соответствующий элемент не найден, функция возвращает значение NULL.

function array_find(array $array, callable $callback): mixed {     foreach ($array as $key => $value) {         if ($callback($value, $key)) {             return $value;         }     }       return null; }

Давайте рассмотрим работу этой функции на примерах.

$array = [     'a' => 'dog',     'b' => 'cat',     'c' => 'cow',     'd' => 'duck',     'e' => 'goose',     'f' => 'elephant' ];   // Поиск первого животного с именем, длина которого превышает 4 символа. var_dump(array_find($array, function (string $value) {     return strlen($value) > 4; })); // string(5) "goose"   // Поиск первого животного с именем, которое начинается на f. var_dump(array_find($array, function (string $value) {     return str_starts_with($value, 'f'); })); // NULL   // Поиск первого животного, в котором ключ массива является первым символом животного. var_dump(array_find($array, function (string $value, $key) {    return $value[0] === $key; })); // string(3) "cow"   // Поиск первого животного, у которого ключ массива соответствует регулярному выражению. var_dump(array_find($array, function ($value, $key) {    return preg_match('/^([a-f])$/', $key); })); // string(3) "dog"

array_find_key

array_find_key возвращает ключ первого элемента, для которого функция $callback возвращает значение true. Если соответствующий элемент не найден, функция возвращает значение NULL.

function array_find_key(array $array, callable $callback): mixed {     foreach ($array as $key => $value) {         if ($callback($value, $key)) {             return $key;         }     }       return null; }

Давайте рассмотрим работу этой функции на примерах.

$array = [     'a' => 'dog',     'b' => 'cat',     'c' => 'cow',     'd' => 'duck',     'e' => 'goose',     'f' => 'elephant' ];   // Поиск первого животного с именем, длина которого превышает 4 символа. var_dump(array_find_key($array, function (string $value) {     return strlen($value) > 4; })); // string(1) "e"   // Поиск первого животного с именем, которое начинается на f. var_dump(array_find_key($array, function (string $value) {     return str_starts_with($value, 'f'); })); // NULL   // Поиск первого животного, в котором ключ массива является первым символом животного. var_dump(array_find_key($array, function (string $value, $key) {    return $value[0] === $key; })); // string(1) "c"   // Поиск первого животного, у которого ключ массива соответствует регулярному выражению. var_dump(array_find_key($array, function (string $value, $key) {    return preg_match('/^([a-f])$/', $key); })); // string(1) "a"

array_any

array_any возвращает значение true, если $callback возвращает значение true для любого элемента. В противном случае функция возвращает значение false.

function array_any(array $array, callable $callback): bool {     foreach ($array as $key => $value) {         if ($callback($value, $key)) {             return true;         }     }       return false; }

Давайте рассмотрим работу этой функции на примерах.

$array = [     'a' => 'dog',     'b' => 'cat',     'c' => 'cow',     'd' => 'duck',     'e' => 'goose',     'f' => 'elephant' ];   // Проверяет, не содержит ли название какого-либо животного более 5 букв. var_dump(array_any($array, function (string $value) {     return strlen($value) > 5; })); // bool(true)   // Проверяет, не содержит ли название какого-либо животного более 3 букв. var_dump(array_any($array, function (string $value) {     return strlen($value) < 3; })); // bool(false)   // Проверяет, не является ли какой-либо ключ массива строкой. var_dump(array_any($array, function (string $value, $key) {    return !is_string($key); })); // bool(false)

array_all

array_all возвращает значение true, если $callback возвращает значение true для всех элементов. В противном случае функция возвращает значение false.

function array_all(array $array, callable $callback): bool {     foreach ($array as $key => $value) {         if (!$callback($value, $key)) {             return false;         }     }       return true; }

Давайте рассмотрим работу этой функции на примерах.

$array = [     'a' => 'dog',     'b' => 'cat',     'c' => 'cow',     'd' => 'duck',     'e' => 'goose',     'f' => 'elephant' ];   // Проверяет, все ли названия животных короче 12 букв. var_dump(array_all($array, function (string $value) {     return strlen($value) < 12; })); // bool(true)   // Проверяет, все ли названия животных длиннее 5 букв. var_dump(array_all($array, function (string $value) {     return strlen($value) > 5; })); // bool(false)   // Проверяет, все ли ключи массива являются строками. var_dump(array_all($array, function (string $value, $key) {    return is_string($key); })); // bool(true)

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

Функции, созданные пользователем и названные array_find, array_find_key, array_any или array_all, приводят к ошибке PHP в новой версии. Быстрый поиск на GitHub показывает, что есть 656 результатов, определяющих символ array_find, 28 результатов, определяющих символ array_find_key, 127 результатов, определяющих символ array_any и 284 результата, определяющих символ array_all для языка PHP.

Глядя на результаты поиска, я оцениваю, что около 30% этих результатов — это функции, которые не находятся в пространстве имен, не являются частью класса и не являются ложными выводами (например, символ — db_array_all вместо array_all).

Больше интересных новостей, мыслей и мемов в Пихта DEV


ссылка на оригинал статьи https://habr.com/ru/articles/827854/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *