array_find в PHP 8.4

Источник: «array_find in PHP 8.4»
В PHP 8.4 добавлено несколько функций, которых давно не хватало: array_find() и её вариации. Назначение array_find() простое: передайте ей массив и обратный вызов, и получите первый элемент, для которого обратный вызов вернёт true.
$numbers = [1, 2, 3, 4, 5, 6];

$firstMatch = array_find(
array: $numbers,
callback: fn (int $number) => $number % 2 === 0
);

Для начала хотелось бы сделать замечание о соглашении об именовании: в Laravel функция, возвращающая первый элемент из массива, соответствующий обратному вызову, называется Collection::first(), а не find. Это может вызвать некоторую путаницу у людей, ожидающих, что array_find() вернёт все элементы, соответствующие условию обратного вызова.

Решение в пользу array_find() вместо array_first() не такое уж и странное: во многих языках есть метод для поиска первого подходящего элемента из массива, и эти функции всегда называются find. Для примера можно привести два языка: JavaScript и Rust.

Если нужно получить несколько элементов из массива на основе обратного вызова, то функция array_filter() — это то, что нужно.

$numbers = [1, 2, 3, 4, 5, 6];

$allMatches = array_filter(
array: $numbers,
callback: fn (int $number) => $number % 2 === 0
);

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

$firstMatch = array_find(
array: $array,
callback: fn (mixed $value, int|string $key) => /* … */
);

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

array_find_key

Помимо array_find(), теперь есть ещё и функция array_find_key(). Она делает то же самое, но возвращает ключ вместо значения найденного элемента:

$numbers = [1, 2, 3, 4, 5, 6];

$firstMatchedKey = array_find_key(
array: $numbers,
callback: fn (int $number) => $number % 2 === 0
);

array_any и array_all

Наконец, добавлены две связанные функции, возвращающие не значение, а логическое значение. array_any() вернёт true, если хотя бы один элемент в массиве соответствует условию обратного вызова, а array_all() вернёт true, только если все элементы соответствуют условию обратного вызова:

$numbers = [1, 2, 3, 4, 5, 6];

// True: по крайней мере один элемент делится на 2
array_any(
array: $numbers,
callback: fn (int $number) => $number % 2 === 0
);

// False: не все элементы делятся на 2
array_all(
array: $numbers,
callback: fn (int $number) => $number % 2 === 0
);

// True: все элементы меньше 10
array_all(
array: $numbers,
callback: fn (int $number) => $number < 10
);

Дополнительные материалы

Предыдущая Статья

Поддержка HTML 5 в PHP 8.4

Следующая Статья

Версионирование API в Laravel 11