
本文讲解如何在php中解析并比较多个json格式的字符串数组元素,精准定位并提取所有值为"1"的字段,最终构建成结构化结果。适用于权限配置、状态比对等实际开发场景。
本文讲解如何在php中解析并比较多个json格式的字符串数组元素,精准定位并提取所有值为"1"的字段,最终构建成结构化结果。适用于权限配置、状态比对等实际开发场景。
在实际开发中,我们常遇到以JSON字符串形式存储的配置数据(如前端传来的权限项),这些数据被封装在PHP数组中,需进行跨元素比对与条件筛选。例如,给定一个包含两个JSON字符串的数组,每个字符串代表一组模块权限(tranc、report、company等),其值均为单元素字符串数组(如 ["2"] 或 ["1"]),目标是:找出所有在任意一个元素中取值为 "1" 的字段,并保留其在第二个数组项中的完整值(即优先采用 Array[1] 的对应字段)。
注意:原始问题中期望输出 {"company":["1"],"facilities":["1"],"area":["1"]},但示例答案仅简单输出 $array[1]——这属于误解。正确逻辑应是 逐字段比对两个JSON对象,收集所有出现 "1" 的键,并从第二个对象中提取其值。以下是专业、健壮的实现方案:
✅ 正确实现步骤
- 使用 json_decode() 将每个JSON字符串转为关联数组(true 参数确保返回数组而非对象);
- 对两个解码后的数组执行键名遍历,逐字段比较其唯一值(因每个字段值均为长度为1的数组,取 [0] 即可);
- 若任一数组中该字段的值等于 "1",则从第二个数组中提取该字段(保证结果一致性);
- 最终用 json_encode() 输出标准JSON格式结果。
<?php
$array = [
'{"tranc":["2"],"report":["2"],"company":["2"],"facilities":["2"],"area":["1"],"zone":["2"]}',
'{"tranc":["2"],"report":["2"],"company":["1"],"facilities":["1"],"area":["1"],"zone":["2"]}',
];
// 解码为关联数组
$data0 = json_decode($array[0], true);
$data1 = json_decode($array[1], true);
// 检查解码是否成功(关键容错)
if ($data0 === null || $data1 === null) {
throw new InvalidArgumentException('Invalid JSON string in input array');
}
$result = [];
// 遍历所有可能的键(以data1为准,兼顾健壮性可取array_keys(array_merge(...)))
$allKeys = array_unique(array_merge(array_keys($data0), array_keys($data1)));
foreach ($allKeys as $key) {
// 确保键存在且值为有效数组
$val0 = $data0[$key] ?? null;
$val1 = $data1[$key] ?? null;
if (is_array($val0) && count($val0) === 1 && $val0[0] === '1') {
$result[$key] = $val1 ?: $val0; // 优先取data1,缺失则回退
} elseif (is_array($val1) && count($val1) === 1 && $val1[0] === '1') {
$result[$key] = $val1;
}
}
// 输出标准化JSON(保持原始嵌套结构)
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
// 输出:{"company":["1"],"facilities":["1"],"area":["1"]}
?>⚠️ 注意事项
- JSON安全性:始终校验 json_decode() 返回值是否为 null,避免后续操作报错;
- 值结构假设:本方案假设每个字段值均为单元素数组(如 ["1"])。若结构变化(如 ["1","2"]),需调整判断逻辑(例如使用 in_array("1", $value));
- 键一致性:若两组JSON字段不完全一致,建议先合并键集(如示例中 array_unique(array_merge(...))),避免遗漏;
- 性能提示:对于超大数组,可考虑使用 array_filter() + 匿名函数替代显式循环,提升可读性。
通过以上方法,你不仅能准确提取目标字段,还能构建可复用、易维护的比对逻辑,真正解决动态权限、多版本配置差异识别等典型工程问题。











