array_is_list在php 8.2中仅当数组键为从0开始连续递增的整数时返回true,空数组例外返回true;键不从0开始、不连续、含字符串键或顺序错乱均返回false。

array_is_list 在 PHP 8.2 中严格判断“是否为列表”:仅当数组键是 从 0 开始、连续递增的整数 时才返回 true。只要中间缺一个索引(比如 [0 => 'a', 2 => 'c']),或键不是整数(如 ['a' => 1]),哪怕值完全正常,也会返回 false。业务中若此前依赖 is_array($arr) && !isset($arr['0']) 或简单 count 判断“是否像列表”,现在容易误判。
识别哪些数组会被判定为非列表
以下情况调用 array_is_list($arr) 均返回 false:
- 键不从 0 开始(
[1 => 'x', 2 => 'y']) - 键不连续(
[0 => 'a', 2 => 'c'],缺少键 1) - 含字符串键(
[0 => 'a', 'name' => 'tom']) - 键顺序错乱(
[2 => 'z', 0 => 'a'],即使键是 0 和 2,但内部顺序非升序排列) - 空数组
[]是例外 —— 它被认定为 list,返回true
业务中常见误用场景与适配建议
很多老代码用 array_keys($arr) === range(0, count($arr)-1) 模拟 list 判断,性能差且冗余。升级到 PHP 8.2 后应直接用 array_is_list,但需确认语义是否匹配业务需求:
- 如果你只关心「值是否按顺序组织」,不强制要求键连续(例如 JSON 解析后可能跳键),那就不要依赖
array_is_list,改用array_values($arr) === $arr(即键已重排为标准 list) - 如果接口明确约定输入必须是“索引数组”,且你此前靠
!is_string(key($arr))粗略判断,现在应统一改用array_is_list并配合错误提示 - 处理用户提交的表单数组(如
items[0][id],items[2][id])时,很可能出现非连续键 —— 此时不应直接传给期望 list 的函数,先做$clean = array_values($items)
安全过渡的兼容写法
在跨版本兼容阶段(如同时支持 PHP 8.1 和 8.2),可封装一个平滑函数:
function is_list_like($arr): bool {
if (!is_array($arr)) return false;
if (function_exists('array_is_list')) {
return array_is_list($arr);
}
// PHP
注意:回退逻辑中 array_keys($keys) 实际生成 [0,1,2...],与原键比对,等价于检查是否为标准索引数组。
调试技巧:快速验证数组结构
开发时遇到 array_is_list 返回意外结果,可用这个小工具打印关键信息:
$arr = ['a', 'b', 'c'];
var_dump([
'keys' => array_keys($arr),
'is_list' => array_is_list($arr),
'values_eq' => array_values($arr) === $arr,
]);
输出会清晰显示键序列和判断结果,避免凭经验猜测。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











