php数组追加与覆盖取决于赋值方式:用[]自动分配下一个整数键(仅计非负整数键);用明确键名直接覆盖;+=只添加不存在的键;array_merge对字符串键覆盖、数字键重排。

PHP 中数组元素的追加与覆盖行为,取决于你使用的赋值方式和键的类型(数字或字符串),不是简单“后写覆盖前写”就能概括的。理解底层规则,才能避免意外覆盖或错位。
使用 [] 追加:自动分配下一个整数键(仅限索引数组)
当对一个数组使用空方括号 [] 赋值时,PHP 会查找当前数组中最大的整数键,然后加 1 作为新键;若数组为空或没有整数键,则从 0 开始。
- 注意:只看整数键,忽略字符串键和负数键
- 已有
[0, 2, 5]→ 下次$arr[] = 'x'的键是6(不是 1 或 3) - 含字符串键如
['a'=>1, 'b'=>2]→[]仍从0开始(因无整数键) - 含负数键如
[-1=>'x']→[]仍从0开始(负数不参与计算)
使用明确键名赋值:直接覆盖(无论键是否存在)
只要写出具体键(如 $arr[3] = 'new' 或 $arr['name'] = 'Tom'),PHP 就会无条件写入该键,旧值被覆盖,不关心是否已存在。
- 键存在 → 值被替换
- 键不存在 → 新增该键值对
- 数字字符串键(如
"123")会被自动转为整数键123,可能意外覆盖已有整数键
关联数组中字符串键不会触发自动递增,但可能隐式转换
用字符串做键(如 $arr['id'] = 1)完全独立于整数键序列,[] 不会影响它,它也不会影响 [] 的计数逻辑。
立即学习“PHP免费学习笔记(深入)”;
- 例外:纯数字字符串键(如
"0"、"12")会被 PHP 当作整数键处理 -
$arr["12"] = 'a'; $arr[] = 'b';→'b'的键是13(因"12"被转为整数12) -
$arr["012"] = 'a';→ 键是字符串"012"(带前导零,不转整数),[]仍从0开始
覆盖判断口诀:看操作符,不看顺序
是否覆盖,只由你写的语句决定:
-
$arr[] = ...→ 追加,不覆盖(除非碰巧键已存在且是整数) -
$arr[$key] = ...→ 强制写入指定键,覆盖优先 -
$arr += ['k'=>'v']→ 只添加$arr中不存在的键,已有键保持原值(右操作数不覆盖左操作数) -
array_merge($a, $b)→ 若键为字符串,$b同名键覆盖$a;若为数字键,全部重排,不保留原键











