array_find в 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
);