php 8.1–8.3 新增多个数组函数:array_is_list()(8.1+)、array_key_first/last()(7.3+)、array_filter_key()(8.2+)、array_find/find_key()(8.3+),使用需注意版本兼容性、空数组返回值、非数组输入报错、与array_search语义差异及o(n)时间复杂度。

PHP 8.1 引入了几个实用的数组新函数(如 array_is_list()、array_key_first()、array_key_last()),8.2 新增 array_filter_key(),8.3 加入 array_find() 和 array_find_key()。这些函数简化了常见操作,但使用时需注意版本兼容性、语义边界和底层行为。
确认 PHP 版本再调用
所有新函数均严格依赖最低 PHP 版本:
-
array_key_first()/array_key_last():PHP 7.3+(较早引入,但常被误认为是“新函数”) -
array_is_list():PHP 8.1+ -
array_filter_key():PHP 8.2+ -
array_find()/array_find_key():PHP 8.3+
在非对应版本中调用会直接触发 Fatal error: Uncaught Error: Call to undefined function。建议用 function_exists() 做降级处理,或通过 Composer 的 platform 配置锁定最低版本。
注意空数组与非数组输入的行为
多数新函数对空数组有明确定义,但不接受非数组类型:
立即学习“PHP免费学习笔记(深入)”;
-
array_is_list([])返回 true(空数组被视为 list) -
array_key_first([])和array_key_last([])均返回 null -
array_find([], fn($v) => true)返回 null(未匹配) - 传入字符串、对象或
null会抛出TypeError(PHP 8.0+ 类型声明强化)
不要依赖隐式转换——例如 array_is_list("abc") 会报错,而非返回 false。
一个功能强大的B2B与B2C的购物平台,除了原本OSC功能外,增加更新的功能: 一、 取消了register_globals必须开启的限制 二、 將HTML程式碼与PHP程式碼完全分离,採用了smarty 樣板引擎 三、 每支档案includes所需函数与资料库连结,使的网页显示速度明显提升 四、 检视、购买商品群组权限设定 五、 十八岁以下禁购机制 六、 折价券购物抵扣机制 七、 礼券购物机制
区分 array_find() 和 array_search()
两者目标相似,但逻辑不同:
-
array_find($arr, $callback):返回第一个满足条件的值(不是键) -
array_search($needle, $arr):返回第一个匹配值的键(严格比较,且只支持标量)
例如:
$users = [['id'=>1,'name'=>'Alice'], ['id'=>2,'name'=>'Bob']];array_find($users, fn($u) => $u['name'] === 'Bob'); // 返回 ['id'=>2,'name'=>'Bob']
array_search('Bob', array_column($users, 'name')); // 返回 1(键)
若你需要键,应搭配 array_find_key();若需多条件或复杂判断,array_find() 更灵活。
性能与遍历特性不可忽略
新函数内部仍是线性遍历,但有隐含细节:
-
array_is_list()需检查所有键,时间复杂度 O(n),不是常量操作 -
array_find()在找到首个匹配项后立即终止,适合“找一个”场景 -
array_filter_key()不修改原数组,返回新数组,注意内存开销(尤其大数组)
避免在高频循环中反复调用 array_is_list() 判断结构——可缓存结果或改用更轻量的键检测逻辑(如 isset($arr[0]) && count($arr) === count(array_keys($arr)) 仅作粗略判断)。










