array_is_list() 在 PHP 8.1–8.4 中行为完全一致,返回 false 的情况包括:键不从 0 开始、整数键不连续、存在非整数键;空数组返回 true,时间复杂度 O(1),兼容性无变化。

PHP 8.4 中 array_is_list() 的行为与 PHP 8.1–8.3 完全一致,没有变更。它仍严格判断数组是否为「从 0 开始、连续整数键、无缺失」的列表结构,对非连续数字索引数组(如 [0=>'a', 2=>'c']、[5=>'x']、[1=>'b', 0=>'a'])一律返回 false。
哪些情况会被判为 false(即“非连续数字索引”)
只要满足以下任一条件,array_is_list() 就返回 false:
- 键不从
0开始(例如[1=>'a', 2=>'b']) - 整数键中间有跳跃(例如
[0=>'a', 2=>'c']或[0=>'x', 1=>'y', 3=>'z']) - 存在任意非整数键(包括字符串键如
'id'、浮点键如1.0、布尔键true、null键) - 键顺序混乱不影响判断逻辑——但注意:
array_is_list([1=>'b', 0=>'a'])仍为false,因为键集合是[1, 0],不等于[0, 1](内部按插入顺序取键,再比对完整序列)
PHP 8.1 到 8.4 的行为完全兼容
自 PHP 8.1 引入以来,array_is_list() 的语义和实现未作任何调整:
- 空数组
[]始终返回true - 时间复杂度保持 O(1),不遍历键,而是直接检查底层哈希表结构标志位(Zend 引擎优化)
- 不修改原数组,不触发排序或重排,无副作用
- 对超大数组(百万级元素)同样高效,不受数据规模影响
旧版本(PHP < 8.1)如何安全替代
若需兼容 PHP 7.x 或早期 8.0,应避免常见误判写法,使用以下可靠方案:
立即学习“PHP免费学习笔记(深入)”;
- 先用
array_keys($arr)获取实际键数组(保留原始顺序) - 生成期望键序列:
range(0, count($arr) - 1) - 用全等比较:
$keys === range(0, count($arr) - 1) - 务必加类型判断:
!is_array($arr)提前返回false
为什么不用 is_int() + 循环或 ksort?
这些方式在所有 PHP 版本中都不可靠:
- 仅检查每个键是否为整数(
is_int()),无法确认是否从 0 起始或是否连续 -
ksort($arr, SORT_NUMERIC)会改变原数组顺序,且排序后键仍是[1,0]→ 排成[0,1],但原始结构已破坏,逻辑错位 -
array_values($arr) === $arr比的是值数组和原数组,类型结构不同,恒为false(除非原数组恰好也是 0 开始连续整数键)



















