News

New Array Find Functions in PHP 8.4

Published Updated
New Array Find Functions in PHP 8.4 image

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.

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Filed in

Sponsored

serpapi logo
SerpApi

The Web Search API for Your LLM and AI Applications

Visit SerpApi

The latest

View all →
Laravel Rulebook: Business Rules That Change by Date image

Laravel Rulebook: Business Rules That Change by Date

Read article
Taylor disabled GitHub Issues on most Laravel open-source packages. image

Taylor disabled GitHub Issues on most Laravel open-source packages.

Read article
Exclude Vendor and Default Commands in `php artisan dev` image

Exclude Vendor and Default Commands in `php artisan dev`

Read article
The Laracon Archive image

The Laracon Archive

Read article
Group Adjacent Collection Items in Laravel with chunkBy() image

Group Adjacent Collection Items in Laravel with chunkBy()

Read article
Laravel queue:work Now Prints Why the Worker Stopped image

Laravel queue:work Now Prints Why the Worker Stopped

Read article