PHP中合并嵌套JSON对象并覆盖差异值的实现方案
深度嵌套数组的覆盖式合并解决方案
你需要的是递归深度合并:保留原数组的所有键,仅用第二个数组中对应层级的键值覆盖原数组内容,不管嵌套多少层。array_merge会直接替换整个子数组,array_merge_recursive会把同键值合并为数组,都不符合需求,下面是可行的实现方法:
实现步骤
- 将两个JSON字符串解码为PHP关联数组(第二个参数传
true) - 编写递归合并函数,处理嵌套层级的覆盖逻辑
- 合并后可根据需求编码回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
相关产品推荐
相关产品推荐

