判断PHP数组是否为索引数组的关键是其键是否完全由从0开始、连续递增的整数构成;常用方法有:array_keys($arr) === range(0, count($arr)-1) 或 $arr === array_values($arr),二者均需用全等比较,且空数组视为索引数组。

判断一个 PHP 数组是否为索引数组,关键不是看“有没有数字键”,而是看它**是否完全由从 0 开始、连续递增的整数键构成**。PHP 中没有内置函数直接返回 is_indexed_array(),但有几种清晰可靠的方式可以实现。
看键是否全是整数且连续
这是最常用也最贴近定义的方法:取出所有键,检查它们是否等于 range(0, count($arr) - 1)。
-
原理:索引数组的键必须是
0, 1, 2, ..., n-1,不多不少、不跳不乱 -
写法示例:
$arr = ['a', 'b', 'c']; $isIndexed = array_keys($arr) === range(0, count($arr) - 1); // true
-
注意:用
===(全等),不能用==,避免类型隐式转换导致误判
用 array_values() 对比原数组
索引数组的值顺序和键顺序天然一致,调用 array_values() 不会改变结构,所以可直接比较。
-
写法示例:
$arr = [10, 20, 30]; $isIndexed = $arr === array_values($arr); // true
-
优点:简洁、高效,对空数组也安全(
[] === array_values([])返回true) - 局限:如果数组里有对象或资源等不可序列化/不可比较的内容,可能触发警告;但普通字符串、数字、null、布尔值都 OK
排除关联特征(辅助验证)
如果确认数组非空,也可以先快速排除“明显是关联数组”的情况:
立即学习“PHP免费学习笔记(深入)”;
- 遍历
array_keys($arr),只要发现一个键不是int类型(比如字符串'id'或数字字符串'0'),就不是索引数组 - 即使全是整数键,也要检查是否从 0 开始——例如
[5 => 'x', 6 => 'y']是整数键但不是索引数组 - 可组合使用:
!empty($arr) && !array_filter(array_keys($arr), 'is_string') && array_keys($arr) === range(0, count($arr)-1)
别踩这些坑
以下常见误区要避开:
-
只用
is_numeric($key)或is_int($key)不够:前者会把字符串'123'当作数字,后者在foreach中拿到的键可能是字符串(如json_decode(..., true)解析出的键默认是字符串) -
不要依赖
isset($arr[0]):这只能说明下标 0 存在,不能说明整个数组是索引结构(比如[0=>'a', 99=>'z']也会通过) -
空数组
[]被视为索引数组:符合“从 0 开始连续整数键(长度为 0)”的定义,多数业务逻辑也接受这种处理



















