PHP中合并两个不同结构JSON对象 后者覆盖前者且保留独有键
PHP 多层嵌套JSON合并方案
问题根因
array_merge仅支持浅层合并,只会处理最外层的键值对,遇到嵌套的数组字段(如本例的info)会直接用第二个JSON的对应值整体覆盖,不会递归合并嵌套层的键,因此会丢失JSON1中嵌套层级下的独有键值。
解决方案
方案1:使用PHP内置递归合并函数
PHP内置的array_replace_recursive函数完全符合你的需求:会递归处理所有嵌套层级,用第二个数组的同键值覆盖第一个数组,同时保留第一个数组独有的所有键值。
// 将JSON字符串转为关联数组 $json1 = '{"id":null,"type":"NE","info":{"name":"Ne","last_name":"NE","status":"NE","rfc":"NE","email":"jNE"}}'; $json2 = '{"id":2,"type":"PF","info":{"status":1,"rfc":"DOSLWOOEOE22","email":"email@email.com"}}'; $arr1 = json_decode($json1, true); $arr2 = json_decode($json2, true); // 递归合并 $merged = array_replace_recursive($arr1, $arr2); // 转回JSON,JSON_PRETTY_PRINT用于格式化输出 $result = json_encode($merged, JSON_PRETTY_PRINT); echo $result;
方案2:自定义递归合并函数
如果需要自定义合并逻辑,也可以自己实现递归合并方法:
function customRecursiveMerge(array $base, array $override): array { foreach ($override as $key => $val) { // 两个数组的同键都是数组时,递归合并该层级 if (isset($base[$key]) && is_array($base[$key]) && is_array($val)) { $base[$key] = customRecursiveMerge($base[$key], $val); } else { // 否则直接覆盖 $base[$key] = $val; } } return $base; } // 调用方式 $merged = customRecursiveMerge($arr1, $arr2);
两种方案输出的结果都和你预期的完全一致。
内容的提问来源于stack exchange,提问作者pedroooo
相关产品推荐
相关产品推荐

