PHP 中数组 + 运算符是左优先的静态联合操作,保留左侧所有键值对,仅添加右侧不存在于左侧的键值对,不覆盖、不重索引、不警告。

因为 + 运算符在 PHP 中定义为「数组联合(array union)」操作,不是数学加法,也不是覆盖式合并,它的语义就是“用右侧数组补全左侧数组中缺失的键”,所以天然以左侧为权威来源。
左侧优先是语言层面的设计约定
PHP 明确规定:$a + $b 的结果包含所有 $a 的键值对,再把 $b 中「键名不在 $a 里出现过」的键值对追加进来。这个规则写死在 Zend 引擎的实现中,和数组类型(字符串键/数字键)无关,也和值的内容无关。
- 相同字符串键:直接跳过
$b的值,不覆盖、不警告、不报错 - 相同数字键(如
0):同样跳过$b的值,$a的索引位置和值完全保留 - 新键(无论字符串或数字):从
$b中取值,添加到结果末尾,不重排索引
和 array_merge 的关键区别就在这里
array_merge() 是「顺序叠加 + 按规则重索引」:字符串键被后一个覆盖,数字键被重新编号;而 + 是「静态联合 + 零干预」:所有原始键名原样保留,只做“有无判断”。这种设计让 + 更适合配置覆盖、默认值填充等场景。
- 比如:
$config = $defaults + $user_input;—— 确保用户没填的项仍用默认值 - 但不能用于「把两个数值列表拼成一个新列表」,因为
[0=>'a'] + [0=>'b']结果只有[0=>'a']
注意:+ 只支持两个操作数,不能链式合并多个数组
写 $a + $b + $c 实际是 ($a + $b) + $c,也就是先合并前两个,再用结果和第三个联合。这意味着 $b 的键可能被 $a 屏蔽,而 $c 的同名键又可能被 $a + $b 的结果屏蔽——最终只有最左边数组的键具有绝对优先权。
立即学习“PHP免费学习笔记(深入)”;
- 若需多数组联合且保持左优先,必须显式写成
$a + $b + $c + $d - 若想让某个数组「最后说话」,就得把它放在最右边,但它的同名键依然无效
替代方案要看你真正想要什么
如果发现 + 的“左侧锁死”不符合需求,说明你可能需要别的语义:
- 要覆盖同名键 → 用
array_replace($a, $b)(字符串键和数字键都覆盖,不重索引) - 要递归合并嵌套结构 → 用
array_merge_recursive($a, $b) - 要简单拼接数值列表 → 用
array_merge($a, $b)(数字键自动重排)
选哪个,取决于你心里那条“冲突时谁说了算”的线画在哪。



















