本文目录导读:

- PHP 7.4:短闭包(箭头函数)与
array_merge无关,但新版新增了spread操作符 - PHP 8.0:
str_contains、str_starts_with、str_ends_with(字符串相关,但常用于数组判断) - PHP 8.1:
array_is_list()已经引入,8.1 没有新增专门的数组函数。 - PHP 8.2 / 8.3:暂时没有新增独立的数组函数
- PHP 8.4(最新稳定版):重磅新增!
- 总结表格(按版本)
- 实用建议
在 PHP 中,数组操作是非常核心的功能,从 PHP 7.4 到 PHP 8.x,新增了一些非常实用的数组函数,能够让你写出更简洁、更高效的代码。
下面按照 PHP 版本顺序,为你整理和讲解这些“新”数组函数。
PHP 7.4:短闭包(箭头函数)与 array_merge 无关,但新版新增了 spread 操作符
虽然 7.4 没有直接的新数组函数,但它引入了 解包(Spread)操作符在数组中使用,简化了合并数组的操作。
示例:合并数组(取代 array_merge)
$arrayA = ['a', 'b']; $arrayB = ['c', 'd']; // PHP 7.4+ $result = [...$arrayA, ...$arrayB]; print_r($result); // 输出:['a', 'b', 'c', 'd'] // 旧写法: // $result = array_merge($arrayA, $arrayB);
PHP 8.0:str_contains、str_starts_with、str_ends_with(字符串相关,但常用于数组判断)
虽然这些是字符串函数,但它们经常配合数组的 in_array 使用,PHP 8.0 主要新增了:
- 没有新增核心数组函数,但
match表达式和Named Arguments让数组处理更优雅。
array_is_list() 是 PHP 8.0 明确新增的数组函数。
array_is_list() - 判断数组是否“索引连续且从0开始”
$list = ['a', 'b', 'c']; // 是列表 $notList = ['a' => 1, 'b' => 2]; // 不是列表(关联数组) $mixed = [0 => 'a', 1 => 'b', 3 => 'c']; // 不是列表(索引不连续) var_dump(array_is_list($list)); // true var_dump(array_is_list($notList));// false var_dump(array_is_list($mixed)); // false
应用场景:JSON 编码时,判断输出的是数组还是对象。
$data = ['name' => 'Tom', 'age' => 20];
if (array_is_list($data)) {
echo json_encode($data); // ["Tom", 20] (数组)
} else {
echo json_encode($data); // {"name":"Tom","age":20} (对象)
}
PHP 8.1:array_is_list() 已经引入,8.1 没有新增专门的数组函数。
1 主要新增了 enum、readonly 特性,数组函数方面没有新成员。
PHP 8.2 / 8.3:暂时没有新增独立的数组函数
但这段时间主要优化了性能,array_* 函数内部指针处理的优化。
PHP 8.4(最新稳定版):重磅新增!
PHP 8.4 是近年来对数组支持最大的一个版本,新增了 4 个非常实用的数组函数。
1️⃣ array_find() - 查找第一个符合条件的元素
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 3, 'name' => 'Charlie'],
];
// 找到第一个名字以 'B' 开头的用户
$found = array_find($users, function($user) {
return str_starts_with($user['name'], 'B');
});
print_r($found);
// 输出:['id' => 2, 'name' => 'Bob']
// 如果没有找到,返回 null
2️⃣ array_find_key() - 查找第一个符合条件的元素的键名
$array = ['a' => 10, 'b' => 20, 'c' => 30];
$key = array_find_key($array, function($value) {
return $value > 15;
});
echo $key; // 输出:'b' (第一个值大于15的键)
3️⃣ array_all() - 检查是否所有元素都满足条件(类似 SQL 的 ALL)
$scores = [85, 90, 78, 92];
$allPassed = array_all($scores, function($score) {
return $score >= 60;
});
var_dump($allPassed); // true (所有分数都大于等于60)
$allExcellent = array_all($scores, function($score) {
return $score >= 90;
});
var_dump($allExcellent); // false (不是所有都 >= 90)
4️⃣ array_any() - 检查是否任意一个元素满足条件(类似 SQL 的 ANY)
$scores = [50, 60, 45, 80];
$hasPassed = array_any($scores, function($score) {
return $score >= 60;
});
var_dump($hasPassed); // true (至少有一个 >= 60)
$hasFailed = array_any($scores, function($score) {
return $score < 40;
});
var_dump($hasFailed); // false (没有低于40的)
总结表格(按版本)
| 版本 | 函数 / 特性 | 作用 | 代码示例 |
|---|---|---|---|
| 4 | Spread 操作符 | 合并数组 | $new = [...$a, ...$b]; |
| 0 | array_is_list() |
判断是否索引连续且从0开始 | array_is_list(['a','b']) |
| 4 | array_find() |
查找第一个满足条件的元素 | array_find($arr, fn($v) => $v > 0) |
| 4 | array_find_key() |
查找第一个满足条件的元素的键 | array_find_key($arr, fn($v) => ...) |
| 4 | array_all() |
检查是否所有元素都符合条件 | array_all($arr, fn($v) => $v > 0) |
| 4 | array_any() |
检查是否有任一元素符合条件 | array_any($arr, fn($v) => $v > 0) |
实用建议
- 如果你还在用 PHP 7.x:尽快考虑升级到 8.4,这些新函数能大幅减少
foreach和手动if判断的代码量。 - 如果你想写更现代的代码:
- 用
array_find替代foreach + break。 - 用
array_all/array_any替代array_filter + count判断。 - 用
array_is_list避免手动检查键值。
- 用
最后提醒:这些新函数在 PHP 8.4+ 中才可用,如果项目环境是 PHP 8.0-8.3,你需要自己实现兼容函数(或使用 Polyfill)。