You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:27:01