如何识别两个JSON中的差异数组并合并新增内容至旧JSON?
解决JSON数组增量合并问题:将New.json新增内容合并到Old.json
我明白你要做的是把New.json里每个分类下新增的视频链接,合并到Old.json对应的分类里。先看看你现有代码的问题:你嵌套遍历了Old和New的所有键,相当于把Old的jogos-da-copa和New的jogos-da-copa、apresentacao都做了对比,这完全不是你要的逻辑——我们应该按相同的键名来对应对比,而且你用array_diff($olds1, $news2)是找Old里有但New里没有的元素,和你要的“找New里有但Old里没有的元素”正好相反。
正确的实现思路
- 读取并解析两个JSON文件为PHP关联数组
- 遍历New.json中的每个键值对:
- 如果Old.json里没有这个键,直接把整个数组添加进去
- 如果Old.json里已有这个键,找出New数组中不在Old数组里的元素,追加到Old的对应数组中
- 将合并后的数组重新编码为JSON并保存回Old.json
完整代码示例
// 读取并解析JSON文件 $oldData = json_decode(file_get_contents('old.json'), true); $newData = json_decode(file_get_contents('new.json'), true); // 遍历New数据的每个键值对 foreach ($newData as $key => $newItems) { // 如果Old里没有这个分类,直接添加 if (!isset($oldData[$key])) { $oldData[$key] = $newItems; continue; } // 找出New里有但Old里没有的元素 $newEntries = array_diff($newItems, $oldData[$key]); // 如果有新增元素,追加到Old的对应数组中 if (!empty($newEntries)) { $oldData[$key] = array_merge($oldData[$key], $newEntries); // 如果你想保持New里的顺序,也可以用$oldData[$key] = $newItems; 因为New已包含所有旧元素+新元素,按需选择即可 } } // 将合并后的数据写回Old.json file_put_contents('old.json', json_encode($oldData, JSON_PRETTY_PRINT)); // 可选:输出合并后的结果查看 var_dump($oldData);
执行结果说明
运行这段代码后,Old.json会变成:
{ "jogos-da-copa": [ "/videos/291856.html", "/videos/291830.html", "/videos/291792.html", "/videos/291759.html", "/videos/291720.html", "/videos/291705.html", "/videos/291887.html" ], "apresentacao": [ "/videos/2926328.html", "/videos/67.html", "/videos/36.html", "/videos/3.html", "/videos/2926385.html" ] }
如果你希望新增元素保持在New里的位置(比如开头),直接替换为$oldData[$key] = $newItems;即可,因为New本身已经包含了所有旧元素+新增元素。
为什么你的原代码无效?
- 嵌套遍历
$old1和$new2的所有键,导致无关键之间的对比(比如Old的jogos-da-copa和New的apresentacao对比),完全没有意义 array_diff($olds1, $news2)是计算Old数组相对于New数组的差集,也就是Old有但New没有的元素,和你要找的“New有但Old没有”正好相反,应该用array_diff($news2, $olds1)
内容的提问来源于stack exchange,提问作者Bruno Andrade
相关产品推荐
相关产品推荐

