Four new array functions are likely coming to PHP 8.4 that are still in the RFC voting stage. We're encouraged that the voting is already 100% "yes" votes thus far, with voting ending May 29, 2024. While the RFC acceptance of these functions is pending, it seems likely that these functions are coming to PHP 8.4:
-
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 proposed change in the RFC. This feature likely drops in PHP 8.4. The implementation for these functions is currently in draft and can be found on GitHub.
The post New Proposed Array Find Functions in PHP 8.4 appeared first on Laravel News.
Join the Laravel Newsletter to get all the latest Laravel articles like this directly in your inbox.