array_is_list 判断数组键是否为从0开始的连续整数序列,不关心值内容;需先用is_array()确认类型,再配合count()或下标访问使用,PHP 8.1+引入,不能替代json_decode的true参数。

array_is_list 判断的是“索引是否连续且从 0 开始”
它不关心值是什么,只检查键(key)是否构成一个严格递增的整数序列:0, 1, 2, ..., n-1。哪怕数组里全是 null 或空字符串,只要键满足这个结构,就返回 true。
常见误判场景:
- 键是
[0, 1, 3]→ 缺了 2,返回false - 键是
[1, 2, 3]→ 起始不是 0,返回false - 键是
[0, "1", 2]→ 混入字符串键,返回false - 用
unset()删除中间元素后,即使看起来“像列表”,键已断裂,返回false
和 is_array()、count() 搭配使用才真正有用
array_is_list() 单独用意义有限,它解决的是“这个数组能不能安全当 list 解构或遍历时不跳索引”的问题。实际中常配合其他判断:
- 先用
is_array()排除非数组输入,避免警告 - 再用
array_is_list()确认结构可预测 - 最后用
count()或foreach处理——因为只有确认是 list,你才能放心用$arr[0]、$arr[1]这类下标访问
示例:
立即学习“PHP免费学习笔记(深入)”;
$data = ['a', 'b', 'c'];
if (is_array($data) && array_is_list($data)) {
echo $data[0]; // 安全
}
PHP 8.1+ 才有,低版本不能直接替代 json_decode 的第二个参数
有人想用它来“检测 JSON 解析结果是不是数组而非对象”,这是错的:
-
json_decode('{"a":1}', false)返回stdClass对象,不是数组,array_is_list()根本不适用 -
json_decode('[1,2,3]', true)返回 list 数组,array_is_list()返回true -
json_decode('{"0":1,"1":2}', true)返回关联数组(键是字符串),array_is_list()返回false
所以它不能代替 json_decode($str, true) 的 true 参数,也不能用来区分 JSON 是对象还是数组——那是 is_array() 和 is_object() 的事。
注意 array_values() 会“修复”成 list,但代价是重建数组
如果你拿到一个非 list 数组(比如键为 ['a' => 1, 'b' => 2]),又需要把它当 list 用,array_values() 是最常用手段:
- 它丢弃原键,重排索引为
0, 1, 2...,结果一定满足array_is_list() - 但它是复制操作,对大数组有内存和性能开销
- 如果只是遍历,用
foreach更高效;只有明确需要数字下标访问时,才考虑array_values()
示例:
立即学习“PHP免费学习笔记(深入)”;
$assoc = ['x' => 'foo', 'y' => 'bar']; $list = array_values($assoc); // [0 => 'foo', 1 => 'bar'] var_dump(array_is_list($list)); // true关键点在于:它只看键的数值连续性,不看内容,也不自动转换;用之前先确保是数组,别指望它帮你做类型归一化。



















