
PHP 数组本质上是**有序的哈希表(ordered hash table)**,它同时支持数字下标(索引数组)和字符串下标(关联数组),且保留插入顺序。这不是“模拟”的顺序,而是底层实现(Zend Array)强制保证的行为,从 PHP 5.4 起稳定,PHP 7+ 进一步优化但语义不变。
下标类型:数字与字符串可混用
PHP 不区分“索引数组”和“关联数组”,只有一种数组类型。下标可以是整数或字符串,且可共存于同一数组中:
- 整数下标会自动转换为 int 类型;若写成
"123"这样的数字字符串,PHP 会尝试转为整数(除非含非法字符,如"0123"或"12a") - 字符串下标保持原样,
"0"、"00"、0是三个不同的键(0是整数键,"0"和"00"是字符串键) - 示例:
$arr = [0 => 'a', '0' => 'b', 'x' => 'c'];中,$arr[0]得'a',$arr['0']得'b',count($arr)为3
顺序性:插入顺序严格保留
PHP 数组遍历时(foreach、for、array_keys() 等),元素始终按首次插入的顺序返回,与下标类型无关:
- 追加元素(
$arr[] = ...或$arr['new'] = ...)总在末尾 - 修改已有键值(
$arr['exist'] = ...)不改变其位置 - 删除元素(
unset($arr['key']))仅移除该元素,不影响其余元素顺序 - 注意:
sort()、ksort()等函数会重排顺序;而array_values()重置数字键但不打乱顺序
数字下标自动递增规则
使用空方括号 [] 追加时,PHP 会查找当前数组中最大的整数下标,然后 +1 作为新键(若无整数下标,则从 0 开始):
立即学习“PHP免费学习笔记(深入)”;
-
$a = ['x' => 1]; $a[] = 2;→ 键为'x'和0(因无整数键,从 0 开始) -
$b = [5 => 'a', 'y' => 'b']; $b[] = 'c';→ 新键为6(最大整数键是 5) -
$c = [-3 => 'a', 10 => 'b']; $c[] = 'c';→ 新键为11(最大整数键是 10,负数不参与计算)
实际建议:避免依赖隐式行为
虽然 PHP 数组顺序可靠,但过度依赖自动下标或混合类型易引发歧义:
- 明确指定键名(
$arr['id'] = ...)比依赖[]更清晰 - 处理用户输入或 JSON 解码数据时,注意
"0"和0的差异,必要时用is_int($key)或is_string($key)判断 - 需要真正“纯索引”结构时,可用
array_values($arr)归一化;需“纯关联”时,避免使用纯数字字符串作键 - 迭代前不确定顺序是否被修改?用
array_keys($arr)检查或直接信任插入序——它就是规范行为











