
PHP合并两个数组时跳过空值且不覆盖已有值,核心是用 array_merge_recursive() 不够,需自定义逻辑。关键点有三个:明确“空值”范围(null、''、false、0 等是否算空需按业务定)、保留目标数组的非空值、只用源数组中“非空且目标无值”的项填充。
明确哪些值算“空”再处理
PHP 的 empty() 会把 0、"0"、false 都判为空,但业务中数字 0 往往是有意义的。建议用更精准的判断:
- 若只跳过
null和空字符串:$v === null || $v === '' - 若还排除
false(不含0):$v === null || $v === '' || $v === false - 避免用
empty($v),除非确认0和"0"确实该被忽略
用 foreach 手动合并,安全可控
这是最清晰、不易出错的方式。遍历源数组,逐个检查并写入目标数组:
$target = ['name' => 'Alice', 'age' => 25, 'city' => ''];
$source = ['name' => 'Bob', 'age' => 0, 'city' => 'Beijing', 'email' => ''];
foreach ($source as $key => $value) {
// 目标不存在该键,或目标值为空(按你定义的“空”),才赋值
if (!isset($target[$key]) || $target[$key] === '' || $target[$key] === null) {
// 再检查 source 值本身是否为空,避免填入空值
if ($value !== '' && $value !== null && $value !== false) {
$target[$key] = $value;
}
}
}
// 结果:['name'=>'Alice', 'age'=>25, 'city'=>'Beijing', 'email'=>'']
封装成函数复用更省心
把逻辑抽成函数,以后直接调用:
function array_merge_skip_empty($target, $source, $skip = ['null', 'empty_string']) {
$result = $target;
foreach ($source as $k => $v) {
$isEmpty = false;
if (in_array('null', $skip) && $v === null) $isEmpty = true;
if (in_array('empty_string', $skip) && $v === '') $isEmpty = true;
if (in_array('false', $skip) && $v === false) $isEmpty = true;
if (!$isEmpty && (!isset($result[$k]) || $result[$k] === null || $result[$k] === '')) {
$result[$k] = $v;
}
}
return $result;
}
// 使用
$data = array_merge_skip_empty($user, $input, ['null', 'empty_string']);
注意多维数组要递归处理
如果数组含子数组(如用户资料里有 address 数组),上面方法不适用。此时需递归判断:
- 遇到子数组,先检查目标对应位置是否为数组,再递归合并
- 可基于
is_array()分支处理,避免把数组当“空值”跳过 - 推荐用
array_replace_recursive()配合预过滤——先用array_filter($source, 'strlen')去掉空字符串,再合并,但注意它也会过滤掉0和false
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











