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

PHP中合并嵌套JSON对象并覆盖差异值的实现方案

深度嵌套数组的覆盖式合并解决方案

你需要的是递归深度合并:保留原数组的所有键,仅用第二个数组中对应层级的键值覆盖原数组内容,不管嵌套多少层。array_merge会直接替换整个子数组,array_merge_recursive会把同键值合并为数组,都不符合需求,下面是可行的实现方法:

实现步骤

  1. 将两个JSON字符串解码为PHP关联数组(第二个参数传true)
  2. 编写递归合并函数,处理嵌套层级的覆盖逻辑
  3. 合并后可根据需求编码回JSON

递归合并函数代码

function recursiveMerge(array $original, array $override): array {
    foreach ($override as $key => $value) {
        // 原数组存在该键且两者都是数组时,递归合并子数组
        if (isset($original[$key]) && is_array($original[$key]) && is_array($value)) {
            $original[$key] = recursiveMerge($original[$key], $value);
        } else {
            // 非数组值或原数组无该键时,直接用覆盖值替换
            $original[$key] = $value;
        }
    }
    return $original;
}

示例使用

// 解码第一个JSON
$json1 = '{
   "field 1" : {
      "key 1": "value 1",
      "key 2": {
         "subkey 1": "subvalue 1",
         "subkey 2": "subvalue 2"
      },
      "key 3": "value 3"
   },
   "field 2": {
      "key 4": "value 4",
      "key 5": "value 5"
   },
   "field 3": {
      "key6": "value 6"
   }
}';
$originalArray = json_decode($json1, true);

// 解码第二个JSON
$json2 = '{
   "field 1" : {
      "key 1": "value 10",
      "key 2": {
         "subkey 2": "subvalue 20"
      }
   },
   "field 2": {
      "key 4": "value 40"
   }
}';
$overrideArray = json_decode($json2, true);

// 执行合并
$resultArray = recursiveMerge($originalArray, $overrideArray);

// 编码回JSON并格式化输出
echo json_encode($resultArray, JSON_PRETTY_PRINT);

输出结果

{
   "field 1" : {
      "key 1": "value 10",
      "key 2": {
         "subkey 1": "subvalue 1",
         "subkey 2": "subvalue 20"
      },
      "key 3": "value 3"
   },
   "field 2": {
      "key 4": "value 40",
      "key 5": "value 5"
   },
   "field 3": {
      "key6": "value 6"
   }
}

这个函数支持任意层级的嵌套数组,会逐层检查处理:遇到嵌套数组就递归合并,非数组值直接覆盖,完全匹配你要的效果。

内容的提问来源于stack exchange,提问作者MarcoF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:53:22