php索引数组是键名连续且从0开始的数组,判断需用array_values($arr) === $arr或比较array_keys($arr)与range(0, count($arr)-1),而非仅看print_r输出;array_push()和[]追加可保持结构,但手动赋值或unset会导致键不连续,此时需array_values()重置。

PHP里索引数组就是键名全为连续整数、且从 0 开始的数组。它不是一种独立类型,而是 PHP 数组在特定构造方式下呈现的结构形态。
怎么判断一个数组是不是索引数组
不能只看 print_r() 输出里有没有数字键——PHP 数组可能混用数字键和字符串键,也可能数字键不连续(比如删过元素)。真正可靠的判断方式是:
- 用
array_keys($arr)取出所有键,再用range(0, count($arr) - 1)生成标准索引序列 - 用
===比较两者是否完全相等(顺序+值都一致) - 或者更直接:调用
array_values($arr) === $arr——因为array_values()总是返回重排后的纯索引数组,如果原数组本来就是标准索引结构,那它就等于自己
为什么 array_push() 和 [] 追加会保持索引数组结构
因为这两种操作默认在末尾追加,PHP 会自动计算下一个整数键(比如当前最大键是 4,下一次就用 5)。但注意:
- 如果你手动写
$arr[10] = 'x',再array_push($arr, 'y'),新元素键会是11,不是6 - 一旦中间有空缺(比如 unset 了
$arr[2]),array_values($arr)就成了重置键名的必要手段 -
foreach遍历时不会暴露“空洞”,但for ($i = 0; $i 会报 Notice 或跳过缺失索引
常见误用:把非连续数字键当索引数组
下面这段代码看着像索引数组,其实不是:
$arr = [1 => 'a', 2 => 'b', 4 => 'c']; var_dump(array_values($arr) === $arr); // bool(false)
问题在于键序列是 [1, 2, 4],不是 [0, 1, 2]。这种数组用 for 循环容易漏元素或触发 undefined index;用 json_encode() 会转成对象而非 JSON 数组(因为键不连续);某些函数如 implode() 虽然能用,但底层仍按实际键遍历。
真正需要索引数组时,别依赖“看起来是数字键”,得用 array_values() 主动规整——这点很容易被忽略,尤其在从数据库取数据或合并多个数组后。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











