array_merge() 不接受 null 参数,会触发警告;应先用 ??[] 或 is_array() 判空转空数组,或改用 array_replace_recursive()、手写递归合并函数来控制 null 行为。

array_merge() 遇到 null 值会直接报错
array_merge() 本身不接受 null 作为参数,传进去会触发警告:「Warning: array_merge(): Expected parameter X to be an array, null given」。这不是“合并后变成 null”,而是根本过不了函数入口。常见于从配置、API 返回或数据库读取后没做判空就直接丢给 array_merge()。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
is_array()显式判断,非数组(包括null)统一转成空数组:array_merge($a ?? [], $b ?? [])或array_merge((array)$a, (array)$b) - 注意
(array)$null结果是[],但(array)false是[0 => false],语义不同,慎用强制转换 - 如果来源是 JSON 解码(如
json_decode($str, true)),空值可能为null,解码后应先过滤掉键值为null的项再合并
想保留 null 作为有效值?别用 array_merge()
原生 array_merge() 会把后续数组的同名键完全覆盖前一个——它不区分 null 和其他值。如果你的业务逻辑中 null 表示“显式清空该字段”,而你想在合并时保留这个语义(比如配置继承 + 显式重置),就得绕开 array_merge()。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 手写递归合并函数,对每个键检查值是否为
null,再决定是跳过、覆盖还是保留 - 用
array_replace_recursive()替代:它允许null覆盖非null值,且不会因null参数报错(但依然要求所有参数是数组) - 若需深度合并且控制
null行为,可结合array_filter($arr, function($v) { return $v !== null; })预处理
PHP 8.1+ 可用 null 合并操作符简化判空
PHP 8.1 引入了 ??= 和更安全的空合并链式写法,虽不直接解决 array_merge() 问题,但能减少 null 流入合并环节的概率。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 配置加载后立即标准化:
$config = $raw_config ?? [];或$config = $raw_config ?: []; - 对多层嵌套数组,用空合并链避免中间层为
null导致后续访问出错:$user['profile']['avatar'] ?? '' - 注意
??和?:区别:0、false、''在?:下也会触发默认值,而??只认null
laravel Arr::merge() 对 null 更宽容?
Laravel 的 Arr::merge() 底层仍调用 array_merge_recursive(),同样拒绝 null 参数。但它提供了 Arr::wrap() 和 Arr::undot() 等辅助方法,方便预处理。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 不要直接传
null给Arr::merge($a, $b),先用Arr::wrap($a)—— 它会把null转成[],但也会把字符串转成[$str],注意副作用 - 更稳妥的是组合使用:
Arr::merge(...array_map('Arr::wrap', [$a, $b, $c])) - 若项目已用 Laravel,优先考虑
Arr::replaceRecursive(),它对null值的覆盖行为更可控
null 是“缺失值”还是“有效指令”。关键不是选哪个函数,而是明确你希望 null 在当前上下文中代表什么——然后在数据进入合并流程前就把它变成确定的状态。



















