Four new array functions are coming to PHP 8.4 which are helper functions for checking an array for the existence of elements matching a specific condition. The new functions are:
array_find()array_find_key()array_any()array_all()
The array_find() Function
The array_find($array, $callback) function returns the first element for which the $callback returns true:
$array = [ 'a' => 'dog', 'b' => 'cat', 'c' => 'cow', 'd' => 'duck', 'e' => 'goose', 'f' => 'elephant']; array_find($array, function (string $value) { return strlen($value) > 4;}); // string(5) "goose" array_find($array, function (string $value) { return str_starts_with($value, 'f');}); // null // Find the first animal where the array key is the first symbol of the animal.array_find($array, function (string $value, $key) { return $value[0] === $key;});
Using Laravel's Arr or Collection you can get equivalent functionality with the first() method in combination with a closure:
use Illuminate\Support\Arr;use Illuminate\Support\Collection; $array = [ 'a' => 'dog', 'b' => 'cat', 'c' => 'cow', 'd' => 'duck', 'e' => 'goose', 'f' => 'elephant']; new Collection($array) ->first(fn ($value) => strlen($value) > 4); // goose Arr::first( $array, fn ($value) => str_starts_with($value, 'f')); // null new Collection($array) ->first(fn ($value, $key) => $value[0] === $key); // cow
Note that we are demonstrating class instantiation without extra parenthesis, which should also be in PHP 8.4.
The array_find_key() Function
The array_find_key($array, $callback) function returns the key of the first element for which the $callback returns true. Like array_find(), it returns null if no matching element is found:
$array = [ 'a' => 'dog', 'b' => 'cat', 'c' => 'cow', 'd' => 'duck', 'e' => 'goose', 'f' => 'elephant']; array_find_key($array, function (string $value) { return strlen($value) > 4;}); // string(1) "e" array_find_key($array, function (string $value) { return str_starts_with($value, 'f');}); // null array_find_key($array, function (string $value, $key) { return $value[0] === $key;}); // string(1) "c"
The RFC implementation for this function looks like the following:
function array_find_key(array $array, callable $callback): mixed { foreach ($array as $key => $value) { if ($callback($value, $key)) { return $key; } } return null;}
Using Laravel's Collection, you can get functionality similar to the search() method in combination with a closure. However, search() returns false if the item is not found, not null:
use Illuminate\Support\Arr;use Illuminate\Support\Collection; new Collection($array)->search(function (string $value) { return strlen($value) > 4;}); // string(1) "e" new Collection($array)->search(function (string $value) { return str_starts_with($value, 'f');}); // false new Collection($array)->search(function (string $value, $key) { return $value[0] === $key;}); // string(1) "c"
The array_any() and array_all() Functions
The second part of the RFC (and a separate 2/3 vote) includes the array_any() and array_all() functions. You can use these functions if any of the items in array return true for array_any() and if all of the items in an array return true for array_all(), respectively.
$array = [ 'a' => 'dog', 'b' => 'cat', 'c' => 'cow', 'd' => 'duck', 'e' => 'goose', 'f' => 'elephant']; // Check, if any animal name is longer than 5 letters.array_any($array, function (string $value) { return strlen($value) > 5;}); // bool(true) // Check, if any animal name is shorter than 3 letters.array_any($array, function (string $value) { return strlen($value) < 3;}); // bool(false) // Check, if all animal names are shorter than 12 letters.array_all($array, function (string $value) { return strlen($value) < 12;}); // bool(true) // Check, if all animal names are longer than 5 letters.array_all($array, function (string $value) { return strlen($value) > 5;}); // bool(false)
Learn More
You can read all the details about this change in the RFC. This feature drops in PHP 8.4. The implementation for these functions can be found on GitHub.