php索引数组默认从0连续编号,但显式指定非零起始键或跳号会导致非标准索引;空值不被忽略,isset()检测缺失键返回false;array_values()可重置键但不修改原数组。

PHP索引数组的定义方式看似简单,但实际写错的地方集中在「键是否连续」「是否隐式跳号」「空值是否被忽略」这三点上。直接用 array() 或短语法 [] 创建时,只要不显式指定非数字键,PHP 就会默认生成索引数组——但这个“默认”有前提。
用 array() 或 [] 创建时,键由 PHP 自动分配
这是最常用也最容易出问题的方式。PHP 只在你**完全不写键名**时才从 0 开始连续编号:
-
$arr = array("a", "b", "c");→ 键为0,1,2,是标准索引数组 -
$arr = ["x", "y", "z"];→ 同样是0,1,2,PHP 5.4+ 推荐写法 - 但
$arr = array(1 => "a", "b");→ 键变成1,2,不是从 0 开始,严格来说仍是索引数组(键全为整数),但isset($arr[0])会返回false
注意:array_values() 能强制重置为 0,1,2...,但它是复制操作,不修改原数组。
手动赋值时,跳号会导致“稀疏索引”
这种写法常见于循环中动态添加,但容易埋下隐患:
-
$arr[0] = "first"; $arr[2] = "third";→ 数组长度是3(count($arr)返回 2),但$arr[1]不存在,isset($arr[1])是false -
foreach ($arr as $v)仍能遍历两个元素,但for ($i=0; $i<count> 会访问到 <code>$arr[1]并触发 notice - 如果后续调用
json_encode($arr),结果会是{"0":"first","2":"third"}——变成对象而非 JSON 数组,因为键不连续
判断一个数组是不是“真索引数组”,不能只看 is_array()
PHP 没有内置函数直接判断“是否为从 0 开始连续整数键的索引数组”。常用验证逻辑是:
-
array_keys($arr) === range(0, count($arr)-1)—— 最准确,但性能略低 -
array_values($arr) === $arr—— 更快,但仅当原数组无重复值且顺序一致时才可靠(不推荐用于严格判断) - 实际项目中,更建议在写入阶段就控制:用
$arr[] = $value追加,避免手动指定键
真正容易被忽略的是:数据库查询结果、file() 读取行、explode() 分割字符串,这些返回的都是“真索引数组”,但一旦中间用 unset() 删除某个元素,键就断了,必须跟 array_values() 配合使用才能恢复连续性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











