array_is_list() 是 php 8.1+ 判断数组是否为规范索引列表的唯一可靠方式,要求键必须是从 0 开始连续递增的整数;空数组返回 true,非零起始、跳键、字符串键或混合键均返回 false,且参数必须先 is_array() 校验。

array_is_list() 是 PHP 8.1+ 判断索引数组是否为“列表”的唯一可靠方式,它不看值,只看键:必须是 从 0 开始、连续递增的整数键。低于 8.1 的版本没有等效内置函数,手动判断容易漏掉边界情况。
PHP 8.1+ 直接用 array_is_list()
这个函数专为此场景设计,行为明确、无歧义:
- 空数组
[]返回true -
[0 => 'a', 1 => 'b']返回true -
[1 => 'a', 2 => 'b'](不从 0 开始)→false -
[0 => 'a', 2 => 'b'](中间跳键)→false -
['a' => 'x', 'b' => 'y'](字符串键)→false -
[0 => 'a', '1' => 'b'](键'1'是字符串)→false(array_is_list()只认整数键,不做强制转换)
PHP
不能只用 array_keys() === range(0, count($arr) - 1) —— 这在键为字符串数字(如 '0', '1')时会误判为真。正确做法是逐个检查键的类型和值:
- 先用
is_array($arr)排除非数组 - 遍历
array_keys($arr),对每个键$k检查:!is_int($k) || $k !== $i(其中$i是期望的序号) - 一旦发现非整数键,或键值不等于当前索引,立刻返回
false - 注意:
foreach的迭代顺序就是插入顺序,但键本身必须严格匹配,不能依赖key()+next()模拟
is_array() 和 array_is_list() 不是一个事
很多人混淆这两个概念:
-
is_array($x)只回答“是不是数组”,不管键结构 ——['foo' => 1]、[0=>1, 2=>3]、[]全部返回true -
array_is_list($x)回答“是不是一个规范的索引列表”,是更细粒度的语义判断,常用于 JSON 编码(json_encode()对列表输出[],对关联数组输出{}) - 所以,必须先
is_array(),再array_is_list();否则传入null或字符串会直接报错(PHP 8.1+ 中array_is_list()要求参数必须是 array)
关键细节在于:“列表”不是“索引数组”的同义词。PHP 里所谓“索引数组”只是开发者口头说法,而 array_is_list() 定义的是可被 JSON 序列化为数组字面量的那类结构 —— 键不可见、不可跳、不可偏移、不可混入字符串。老版本自己实现时,最容易忽略的是键的类型校验,以为 0 === (int)'0' 就够了,其实不行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











