array_merge_recursive 遇相同字符串键会将值合并为子数组,而非覆盖;数值键直接追加;需依需求选 array_merge(覆盖)、array_replace_recursive(递归替换)等函数。

当你在 PHP 8.0(或任何支持 array_merge_recursive 的版本)中用 array_merge_recursive 合并两个含相同字符串键名的数组时,它故意把值合并成子数组——这不是 bug,是函数的设计逻辑。
它本来就是这么工作的
array_merge_recursive 的核心行为是:
- 遇到相同字符串键,不覆盖,而是把所有同名键对应的值“收拢”进一个新数组;
- 如果某个值本身是数组,就递归地继续合并;
- 数值键则直接追加,不重命名、不覆盖。
比如:
$a = ['name' => 'Alice', 'score' => 95]; $b = ['name' => 'Bob', 'score' => 87]; $result = array_merge_recursive($a, $b);
结果是:
[ 'name' => ['Alice', 'Bob'], 'score' => [95, 87] ]
因为 'name' 在两个数组里都存在,array_merge_recursive 就把它变成一个包含两个值的数组。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
什么时候你会意外看到“子数组”?
常见于以下情况:
- 你本想用
array_merge覆盖旧值,却误用了array_merge_recursive - 处理表单多选字段、重复提交的同名参数(如
解析后又手动合并) - 从不同来源读取配置,键名重复但期望后者优先,结果却堆成了数组
怎么避免?看需求选对函数
- ✅ 想覆盖同名字符串键 → 用
array_merge - ✅ 想保留全部同名值并归组 → 用
array_merge_recursive - ✅ 想深层覆盖(递归替换) → 用
array_replace_recursive - ✅ 想严格一对一组合键值对 → 用
array_combine(注意 PHP 8.0+ 要求数量严格相等)
小提醒
PHP 8.0+ 对 array_combine 加了强校验(数量不等直接报 ValueError),但 array_merge_recursive 行为自 PHP 4.0.1 起就没变过——它稳定、可预测,只是名字里的 “recursive” 容易让人忽略它的“合并而非覆盖”本质。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










