如何用PHP对比两个JSON对象并输出差异键名与新旧值?
PHP实现两个JSON对象的差异对比
给定两个JSON格式的数组对象,我们需要找出其中值有差异的字段,并生成包含键名、旧值、新值的结果数组,具体实现步骤如下:
步骤说明
- 将JSON字符串解析为PHP关联数组
- 提取两个数组中的目标对象(示例中为数组包裹的单个对象)
- 遍历两个对象的共同键,对比值的差异
- 收集差异数据并整理成指定格式
完整代码示例
<?php // 原始JSON字符串 $json1 = '[{"acc_number":1001,"acc_name":"admin","acc_loc":"headquarters"}]'; $json2 = '[{"acc_number":1001,"acc_name":"New Admin","acc_loc":"branch"}]'; // 解析为PHP关联数组 $object1 = json_decode($json1, true); $object2 = json_decode($json2, true); // 取出数组中的单个对象 $oldData = $object1[0]; $newData = $object2[0]; $result = []; // 遍历两个对象的共同键,避免处理不存在的键 foreach (array_intersect_key($oldData, $newData) as $key => $value) { // 严格对比值(包括类型),如果不同则记录差异 if ($oldData[$key] !== $newData[$key]) { $result[] = [ 'key_name' => $key, 'old_value' => $oldData[$key], 'new_value' => $newData[$key] ]; } } // 输出结果(可选:转成格式化后的JSON) echo json_encode($result, JSON_PRETTY_PRINT); ?>
代码说明
json_decode($json, true):将JSON字符串转为PHP关联数组,方便后续键值操作array_intersect_key:只保留两个对象都存在的键,避免因键不存在导致的报错- 严格比较
!==:确保值的类型和内容都不同才会被记录(比如数字1001和字符串"1001"会被视为不同) JSON_PRETTY_PRINT:让输出的JSON格式更易读,实际使用可根据需求选择是否添加
运行上述代码后,会得到符合要求的结果:
[ { "key_name": "acc_name", "old_value": "admin", "new_value": "New Admin" }, { "key_name": "acc_loc", "old_value": "headquarters", "new_value": "branch" } ]
内容的提问来源于stack exchange,提问作者Waheed
相关产品推荐
相关产品推荐

