推荐用数组联合操作符+,它只补左数组缺失键,同名键不覆盖;需递归补缺时可用自定义array_fill_missing函数,避免array_merge、array_replace和array_merge_recursive的覆盖或合并问题。

用 array_merge_recursive() 不行,它会把同键的值变成数组;用 +(数组联合)最直接——它只补缺失键,已有键完全不覆盖。
推荐:用数组联合操作符 +
PHP 中 $a + $b 的行为是:保留左数组所有元素,仅把右数组中「左数组不存在的键」追加进去,同名键绝不覆盖。
- 注意顺序:左边是“主数组”,右边是“补充数组”
- 不递归:只处理一级键,嵌套数组不会合并内部值
- 索引数组也适用,但数字键会被当作实际键处理(不是追加,而是按值覆盖逻辑)
示例:
$base = ['name' => 'Alice', 'age' => 25]; $patch = ['age' => 30, 'city' => 'Beijing']; $result = $base + $patch; // 结果:['name'=>'Alice', 'age'=>25, 'city'=>'Beijing'] —— age 没被改
需要递归补缺?自己写个简单函数
如果数组有多层,且希望深层缺失键也被补上(比如 $base['user']['email'] 不存在时,用 $patch['user']['email'] 补),就得递归处理。可以这样写:
function array_fill_missing(array $base, array $patch): array {
foreach ($patch as $key => $value) {
if (!array_key_exists($key, $base)) {
$base[$key] = $value;
} elseif (is_array($value) && is_array($base[$key])) {
$base[$key] = array_fill_missing($base[$key], $value);
}
}
return $base;
}
这个函数只在 $base 确实缺键时才写入,遇到同键且双方都是数组就继续递归,其他情况(如键存在但类型不同)保持原值不动。
别踩坑:避开这些常见错误
-
array_merge($a, $b):数字键重排,字符串键后一个覆盖前一个 → 不符合“不覆盖”要求 -
array_replace($a, $b):明确设计为“后覆盖前”,和需求相反 -
array_merge_recursive():同键值会打包成数组(如['k'=>1] + ['k'=>2]变成['k'=>[1,2]])→ 一般不是你想要的
小技巧:批量补多个数组
如果要依次用多个补丁数组填充一个基础数组,可以用 array_reduce:
$base = ['a' => 1]; $patches = [['a'=>99, 'b'=>2], ['b'=>999, 'c'=>3]]; $result = array_reduce($patches, fn($carry, $p) => $carry + $p, $base); // 得到 ['a'=>1, 'b'=>2, 'c'=>3]
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











