В 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/
Добавить комментарий