PHP索引数组默认从0开始是解析器的默认策略而非语法强制,实际由底层哈希表实现决定;键可为任意整数(含负数),未指定时自动从最大已有整数键+1递增;严格索引数组需键连续且从0开始,可用array_is_list()(PHP 8.1+)判定。

PHP索引数组默认从0开始,不是语言强制规定,而是由底层实现和历史惯例共同决定的——它不禁止你从其他数字起步,但只要你没显式指定下标,PHP就自动用 0、1、2… 连续递增。
PHP数组本质是哈希表,0起始只是“默认行为”
PHP的 array 实际是有序哈希表(ordered hash table),键可以是整数或字符串。所谓“索引数组”,只是指“所有键都是连续非负整数,且最小键为 0”的一种特殊情况。PHP在解析 array(1, 2, 3) 时,内部会自动分配键 0、1、2,这不是语法限制,而是解析器的默认策略。
- 写
$a = [10, 20, 30]→ 键自动为0、1、2 - 写
$a = [5 => 10, 20]→ 键变成5、6,不是从 0 开始,但仍算“索引数组”(因键为连续整数) - 写
$a = ['a' => 1, 2, 3]→ 键为'a'、0、1,此时已混入关联结构,array_values()才能还原成纯索引形式
手动指定下标会改变“起始点”,后续下标自动延续
PHP不会重排你已声明的整数键,后续未指定键的元素会从“已有最大整数键 + 1”开始编号,这常被误认为“必须从0开始”。实际它只是“按需递增”:
$arr = [10 => 'x', 'y', 'z']; // 等价于:[10 => 'x', 11 => 'y', 12 => 'z']
-
array(0 => 'a', 1 => 'b')和array('a', 'b')效果相同 -
array(1 => 'a', 'b')→ 键是1、2,不是0、1 -
array(-1 => 'x', 'y')→ 键是-1、0(负数也合法,但后续仍+1)
判断是否为“真正索引数组”不能只看有没有键,得看键是否连续且从0开始
很多函数(如 json_encode()、foreach 遍历顺序)对索引数组和关联数组行为不同。但 PHP 没有内置函数直接返回“是不是索引数组”,得自己校验:
立即学习“PHP免费学习笔记(深入)”;
-
array_keys($arr)返回键列表,检查是否等于range(0, count($arr)-1) - 用
array_values($arr) === $arr可快速粗筛(仅当原数组键全为连续非负整数且从0开始时成立) -
array_is_list()(PHP 8.1+)是唯一官方判定函数,它严格检查键是否为0,1,2,...,n-1
最容易被忽略的是:PHP 允许跳着定义整数键(如 [0=>'a', 2=>'c']),这种数组 不是索引数组,array_is_list() 返回 false,json_encode() 会把它当成对象而非数组输出。别只看有没有字符串键,得盯住整数键的连续性。



















