sergey_web14 May 2026 16:19

PHP 8.4 added array_find() and array_find_key() and I keep seeing people still use the old array_filter + array_values combination that returns an array when they only need one element.

Run this in the sandbox to compare both approaches:

PHP
<?php
$users = [
['id' => 1, 'name' => 'Alice', 'role' => 'admin'],
['id' => 2, 'name' => 'Bob', 'role' => 'user'],
['id' => 3, 'name' => 'Carol', 'role' => 'admin'],
['id' => 4, 'name' => 'Dave', 'role' => 'user'],
];
// Old way: returns array, need to extract first element manually
$found = array_values(array_filter($users, fn($u) => $u['role'] === 'admin'));
var_dump($found[0]['name'] ?? null); // string(5) "Alice"
// PHP 8.4: returns the element directly or null
$found = array_find($users, fn($u) => $u['role'] === 'admin');
var_dump($found['name'] ?? null); // string(5) "Alice"
// array_find_key returns the key, not the value
$key = array_find_key($users, fn($u) => $u['name'] === 'Carol');
var_dump($key); // int(2)
// Returns null when nothing matches
$notFound = array_find($users, fn($u) => $u['role'] === 'superuser');
var_dump($notFound); // NULL
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

The old pattern allocates a new array for something you throw away immediately. array_find() stops at the first match, so it is faster on large arrays too.

Replies (2)
jnovak14 May 2026 16:53

Good catch. Worth noting that array_find() uses the same short-circuit behavior as a foreach with break. I benchmarked it against the filter approach on an array of 100k elements where the match is at index 500: array_find() is about 180x faster in that case because it stops immediately.

Here is the benchmark you can run yourself:

PHP
<?php
$data = range(1, 100_000);
$start = microtime(true);
for ($i = 0; $i < 100; $i++) {
array_find($data, fn($x) => $x === 500);
}
$timeFind = microtime(true) - $start;
$start = microtime(true);
for ($i = 0; $i < 100; $i++) {
$r = array_filter($data, fn($x) => $x === 500);
reset($r);
}
$timeFilter = microtime(true) - $start;
printf("array_find: %.4fs\n", $timeFind);
printf("array_filter: %.4fs\n", $timeFilter);
printf("Speedup: %.1fx\n", $timeFilter / $timeFind);
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0
olena_ua14 May 2026 18:20

One edge case to be aware of: array_find() returns null both when nothing is found and when the matching element itself is null. If you store nulls in your array you need a different check.

PHP
<?php
$data = [1, null, 3, null, 5];
$result = array_find($data, fn($x) => $x === null);
var_dump($result); // NULL — but did it find null or find nothing?
// To distinguish, use array_find_key instead
$key = array_find_key($data, fn($x) => $x === null);
var_dump($key); // int(1) — found at index 1
var_dump($key !== null); // bool(true) — confirms a match was found
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

This is the same ambiguity as array_search() returning false vs 0. Use array_find_key() when the value might be null.

0
Write a reply
Markdown. ```php blocks are runnable.