判断PHP数组是否为连续索引无缺失数组,应使用array_is_list()(PHP 8.1+),它严格验证键为0到n−1的整数序列;旧版可用array_keys()配合range()比对。

判断 PHP 数组是否为“连续索引、无缺失”的数组,核心是确认它的键(key)是否严格满足:从 0 开始、全部为 整数类型、且 依次递增、无跳号(即键集合 = [0, 1, 2, ..., n−1])。这不是看值是否连续,而是看索引结构本身是否构成一个标准列表(list)。
推荐方式:用 array_is_list()(PHP 8.1+)
这是最简洁、最可靠的方法,专为此场景设计:
- 空数组
[]返回true(视为合法空列表) -
[0=>'a', 1=>'b', 2=>'c']→true -
[1=>'a', 2=>'b']或[0=>'a', 2=>'c']或['id'=>'x']→ 全部返回false - 自动排除字符串键、浮点键、null 键、负数键等所有非合规情况
兼容旧版本(PHP
手动比对原始键与理论连续键序列,避免常见陷阱:
- 先用
array_keys($arr)获取所有键(保持顺序) - 生成期望的键数组:
range(0, count($arr) - 1) - 用全等比较
===判断二者是否完全一致(类型 + 值 + 顺序) - 完整函数示例:
<?php
function isSequentialList($arr) {
if (!is_array($arr)) return false;
$keys = array_keys($arr);
return $keys === range(0, count($arr) - 1);
}
为什么这些方法不靠谱?
避开几个高频误用坑:
立即学习“PHP免费学习笔记(深入)”;
-
array_values($arr) === $arr:错误。它比的是「重排后的值数组」和「原数组」,而原数组可能含字符串键,两者结构根本不同,极易误判 -
array_keys($arr) === array_keys(array_values($arr)):永远为 true。因为右边的array_values()强制生成 0,1,2… 键,再取键必然也是 [0,1,2…] - 只用
is_int()遍历每个键:不够。即使全是整数,也可能从 5 开始或中间缺 3,仍不连续 -
ksort($arr, SORT_NUMERIC)后再比:会修改原数组,且排序不能修复原始断层,逻辑错位
关联数组 vs 连续索引数组的边界说明
只要出现以下任一情况,就不是连续索引数组:
- 存在任意字符串键(如
'name'、'0'(注意引号)) - 存在浮点数键(如
1.5)、布尔键(true)、null 键 - 整数键未从 0 起始(如
[5=>'x']) - 整数键有跳跃(如
[0=>'a', 2=>'c'])或乱序(如[1=>'b', 0=>'a'],键顺序不影响判断,但值顺序无关)



















