曾经查个数组元素要写 foreach,一行变五行的日子一去不复返。PHP 8.4 内置了四个实用数组函数,代码瞬间清爽。
如果你写过大量 PHP,大概率写过这样的代码:
```php
// 在数组中查找第一个偶数
$found = null;
foreach ($numbers as $number) {
if ($number % 2 === 0) {
$found = $number;
break;
}
}
```
这就是 PHP 多年来缺少“带回调的数组查找”内置方法带来的样板代码。好消息是,PHP 8.4 终于为我们带来了四个专门解决这类问题的数组函数:array_find、array_find_key、array_any 与 array_all。这期达人秀就用最简短的篇幅,让你彻底吃透它们。
---
一、array_find — 查找第一个满足条件的值
作用:遍历数组,返回第一个让回调返回真值(truthy)的元素值,找不到则返回 null。
```php
$numbers = [5, 7, 8, 10, 12];
$firstEven = array_find($numbers, fn($v) => $v % 2 === 0);
echo $firstEven; // 8
```
回调函数签名:callback(mixed $value, mixed $key): bool。和很多数组函数一样,可以同时拿到值和键名。
---
二、array_find_key — 找到那个元素的键名
作用:返回第一个让回调返回真值的元素的键名,找不到则返回 null。
```php
$products = [
'a' => ['name' => '鼠标', 'price' => 99],
'b' => ['name' => '键盘', 'price' => 0],
'c' => ['name' => '显示器', 'price' => 1299],
];
$onSaleKey = array_find_key($products, fn($item) => $item['price'] === 0);
echo $onSaleKey; // 'b'
```
这个函数非常适合在关联数组中定位特定记录的位置。
---
三、array_any — 是否存在满足条件的元素?
作用:如果数组中至少有一个元素让回调返回真值,则返回 true,否则 false。
```php
$ages = [15, 20, 30];
$hasAdult = array_any($ages, fn($age) => $age >= 18);
var_dump($hasAdult); // true
```
它让你不需要再写 foreach 后接 $found = true; break;,语义极其清晰。
---
四、array_all — 是否所有元素都满足条件?
作用:数组中每个元素都让回调返回真值,才返回 true,否则 false。
```php
$scores = [85, 92, 78, 60];
$allPass = array_all($scores, fn($score) => $score >= 60);
var_dump($allPass); // true
```
这特别适合参数校验、全量断言等场景。
---
五、空数组时的默认行为
你可能会担心空数组的情况,PHP 8.4 对此做了合理的约定:
· array_find 和 array_find_key 在空数组上返回 null(因为没有元素可返回)。
· array_any 在空数组上返回 false(没有任何元素能满足条件)。
· array_all 在空数组上返回 true(空集里的所有元素都满足条件,数学上的“空真”)。
这些行为与逻辑直觉相符,用起来很安全。
---
六、实战:重构你的旧代码
立即来一组对比,看看这些函数怎样让代码从“啰嗦”变成“清爽”。
旧写法:查找第一个负数
```php
$firstNegative = null;
foreach ($values as $v) {
if ($v < 0) {
$firstNegative = $v;
break;
}
}
```
新写法
```php
$firstNegative = array_find($values, fn($v) => $v < 0);
```
旧写法:检查是否所有字段非空
```php
$valid = true;
foreach ($fields as $field) {
if (empty($field)) {
$valid = false;
break;
}
}
```
新写法
```php
$valid = array_all($fields, fn($f) => !empty($f));
```
一行精准表达业务意图,代码量减少的同时可读性飙升。
---
七、一些进阶用法与提醒
1. 回调支持键名参数
function($value, $key),适合在关联数组中根据键名做判断。
2. 数组顺序
这些函数按数组原有顺序遍历,array_find 和 array_find_key 返回的是第一个匹配的结果。
3. 回调必须返回布尔值或被强制转换
PHP 会将返回值自动转为布尔,所以返回 0 或 null 会视为假值,这和 array_filter 的行为一致。
4. 不修改数组
所有新函数都是纯查询操作,不会改动原数组。
5. 匿名函数简洁性
搭配箭头函数(fn)使用,代码更紧凑,非常适合现代 PHP 风格。
---
结语:细节处见现代化
PHP 8.4 不是一鸣惊人的大版本,而是从开发者体验的细微处持续打磨。这四个数组函数并不是什么石破天惊的技术,但它们每年能帮你省下成百上千行重复的 foreach 代码,让程序员的注意力能真正聚焦到业务上。
下次重构项目,不妨打开搜索,把那些“查找第一个满足条件的值”的循环都换成 array_find,你会发现整个项目的气息都变干净了。
达人金句:好代码不是更短,而是更接近“说人话”。array_any 就是在向机器说:“有任何元素满足条件吗?”
---
如果文章对你有用,点赞、在看、转发,让你的团队成员也早日用上这些省心函数。 ✨
---
(下期预告:PHP 8.4 的 Lazy Objects 揭秘——让对象按需初始化的魔法,敬请期待。)
---