PHP 数组元素追加与覆盖规则详解

2次阅读

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

PHP 数组元素追加与覆盖规则详解

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;若为数字键,全部重排,不保留原键
text=ZqhQzanResources