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()
array_find()
Function
The 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.
array_find_key()
Function
The 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"
array_any()
and array_all()
Functions
The 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.