应使用 array_merge_recursive(),它对相同键递归合并为数组,确保不丢失任何值;若需自定义逻辑,可用 foreach 手动处理,避免 + 运算符(会覆盖同名键值)。

用 + 运算符即可,它会保留左边数组的键值,右边同名键不覆盖,且所有键(包括重复键名)都保留原值 —— 但注意:这仅适用于“键名不冲突时保留两边”,而你真正需要的是“合并时**不丢任何键,相同键名的值也都要保留**”,即类似“多维堆叠”效果。PHP 原生没有直接函数,需手动处理。
用 array_merge_recursive()(适合多数场景)
这是最常用、最贴近需求的方法。它对相同字符串键进行递归合并,把值转为数组(即使原值是字符串或数字),确保无丢失:
$a = ['name' => 'Alice', 'age' => 25]; $b = ['name' => 'Bob', 'city' => 'Beijing']; $result = array_merge_recursive($a, $b); // 结果:['name' => ['Alice', 'Bob'], 'age' => 25, 'city' => 'Beijing']
- 相同键(如
name)的值自动组成数组,不覆盖不丢弃 - 不同键(如
age、city)直接平级合并 - 注意:如果原值已是数组,会继续递归合并;若要避免嵌套过深,可配合
array_values()或自定义扁平逻辑
手动循环合并(完全可控,支持任意策略)
当需要更精细控制(比如统一转成数组、去重、加前缀等),可用 foreach 遍历叠加:
$a = ['name' => 'Alice', 'age' => 25];
$b = ['name' => 'Bob', 'city' => 'Beijing'];
$result = [];
foreach ([$a, $b] as $arr) {
foreach ($arr as $k => $v) {
if (!isset($result[$k])) {
$result[$k] = $v;
} else {
// 已存在则转为数组并追加
if (!is_array($result[$k])) {
$result[$k] = [$result[$k]];
}
$result[$k][] = $v;
}
}
}
// 结果同上:['name' => ['Alice','Bob'], 'age'=>25, 'city'=>'Beijing']
- 逻辑清晰,可随时插入过滤、类型判断、默认值处理等
- 适合需要兼容 null/0/false 等“假值”的场景(
isset不误判) - 若想让所有键最终都为数组(包括单值),最后加一句
array_map(fn($v) => is_array($v) ? $v : [$v], $result)
用 + 运算符?慎用!它不满足“保留所有值”
$a + $b 是右操作数补左操作数缺失键,但同名键会被左边覆盖,右边值直接丢失:
$a = ['name' => 'Alice', 'age' => 25]; $b = ['name' => 'Bob', 'city' => 'Beijing']; var_dump($a + $b); // 输出:['name'=>'Alice', 'age'=>25, 'city'=>'Beijing'] → Bob 被丢弃!
- 只适合“配置覆盖”类场景(如默认配置 + 用户配置)
- 不符合题干“保留所有键名不丢值”的核心要求
进阶:合并后展平同键数组(按需)
如果后续要遍历每个 name 值,可统一预处理:
// 确保所有值都是数组(含单元素)
$normalized = array_map(function($v) {
return is_array($v) ? $v : [$v];
}, $result);
// 取第一个 name:$normalized['name'][0]
// 遍历所有 name:foreach ($normalized['name'] as $n) { ... }
- 避免运行时反复判断类型,提升后续代码健壮性
- 特别适合做表单多选、日志聚合、API 多来源数据归并等场景
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











