推荐使用遍历加isset()判断的方式:初始化空数组,按顺序遍历各数组,仅当键在结果中不存在时才赋值;若需递归处理多维数组,可封装mergeKeepFirst函数实现首次出现即锁定。

PHP 合并数组时保留键的第一个出现的值(即遇到重复键时不覆盖,而是跳过后续同名键),不能直接用 array_merge() 或 + 运算符——因为前者会用后一个数组的值覆盖前一个,后者虽保留左侧键值但只对一维有效且不递归处理。
使用 array_merge_recursive() 不适用,需自定义逻辑
array_merge_recursive() 会把重复键的值转为数组,不是“保留第一个值”。要真正实现“首次出现即锁定”,推荐以下两种可靠方式:
✅ 推荐方法:遍历 + isset() 判断
- 初始化空数组作为结果容器
- 按顺序遍历所有待合并数组(如
$arr1, $arr2, $arr3) - 对每个元素,用
!isset($result[$key])判断该键是否已存在,仅不存在时才赋值
示例代码:
$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['b' => 99, 'c' => 3];
$arr3 = ['a' => 88, 'd' => 4];
$result = [];
foreach ([$arr1, $arr2, $arr3] as $arr) {
foreach ($arr as $k => $v) {
if (!isset($result[$k])) {
$result[$k] = $v;
}
}
}
// 结果:['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4]
兼容关联/数字键,支持多维场景(进阶)
若需递归合并(如二维数组中子数组也按“首次优先”规则),可封装为函数:
function mergeKeepFirst(...$arrays) {
$result = [];
foreach ($arrays as $arr) {
foreach ($arr as $k => $v) {
if (!array_key_exists($k, $result)) {
$result[$k] = $v;
} elseif (is_array($v) && is_array($result[$k])) {
$result[$k] = mergeKeepFirst($result[$k], $v);
}
// 其他类型(string/int等)不覆盖,保持原值
}
}
return $result;
}
注意:+ 运算符在简单场景下可快速使用
对于纯一维关联数组,$result = $arr1 + $arr2 + $arr3; 确实保留左边数组的键值,右边同名键被忽略。但它不检查键是否存在,只按运算顺序左结合,且对数字键会重排索引(不推荐用于含数字键的混合数组)。
所以日常开发中,明确需要“首个值优先”时,优先用 foreach + isset() 方式,清晰、可控、无歧义。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











