
本文介绍如何在 PHP 中解析一组 JSON 格式的字符串数组,逐字段比对键值,精准筛选出所有值为 "1" 的字段,并重组为结构化数组——适用于权限比对、配置差异分析等典型场景。
本文介绍如何在 php 中解析一组 json 格式的字符串数组,逐字段比对键值,精准筛选出所有值为 `"1"` 的字段,并重组为结构化数组——适用于权限比对、配置差异分析等典型场景。
在实际开发中,我们常遇到以 JSON 字符串形式存储的配置或状态数据,例如多组用户权限标识(如 {"tranc":["2"],"company":["1"],...})。当需要从多个类似结构的 JSON 字符串中识别“仅在某一条中出现值为 "1" 的字段”时,不能简单依赖数组索引(如直接取 $array[1]),而应进行语义级比对:即对每个键(如 "company")检查其对应值是否为 "1",且该值在其他条目中不统一为 "1"(本例中目标是提取 包含 "1" 的那条完整记录,但更健壮的做法是按字段横向对比)。
不过,根据问题原始意图——“比较 Array[0] 和 Array[1],获取值为 "1" 的字段并存入新数组”——其真实需求实为:找出所有键对应的值在两条记录中存在差异,且其中一条值为 "1" 的字段,并保留该 "1" 所在的完整原始结构。但示例答案仅返回了 $array[1] 的原始字符串,未真正执行字段级比对。下面提供两种专业级实现方案:
✅ 方案一:提取「至少有一条含 "1"」的字段(推荐)
<?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"]}',
];
// 步骤1:统一解码为关联数组
$parsed = array_map(fn($json) => json_decode($json, true), $array);
// 步骤2:收集所有键,逐个比对值是否含"1"
$result = [];
$allKeys = array_keys($parsed[0]);
foreach ($allKeys as $key) {
$hasOne = false;
foreach ($parsed as $item) {
if (isset($item[$key][0]) && $item[$key][0] === '1') {
$hasOne = true;
break;
}
}
if ($hasOne) {
// 保留第一个出现"1"的条目中的该字段值(或按需选最新条目)
foreach ($parsed as $item) {
if (isset($item[$key][0]) && $item[$key][0] === '1') {
$result[$key] = $item[$key];
break;
}
}
}
}
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
// 输出:
// {
// "company": ["1"],
// "facilities": ["1"],
// "area": ["1"]
// }
?>✅ 方案二:严格匹配「仅在第二条为 "1"」的字段(精准还原问题示例)
若明确只需第二条(索引 1)中值为 "1" 的字段,可直接解析后过滤:
<?php
$jsonStr = $array[1]; // 明确取第二条
$data = json_decode($jsonStr, true);
$result = array_filter($data, function($value) {
return isset($value[0]) && $value[0] === '1';
});
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
// 输出同上(仅含 company/facilities/area)
?>⚠️ 注意事项
- JSON 安全性:务必使用 json_last_error() 检查解码结果,避免无效 JSON 导致静默失败;
- 值类型一致性:示例中值为字符串 "1" 而非整数 1,比较时必须用 === '1',不可用 == 1;
- 嵌套结构:当前数据为单层数组(如 ["1"]),若结构更深(如 ["1", "3"]),需扩展逻辑判断是否 包含 "1";
- 性能提示:大数据量时,避免重复 json_decode,建议提前解析并缓存。
综上,与其机械取索引,不如通过 json_decode + 数组遍历实现语义化比对——这既是 PHP 处理 JSON 配置的标准实践,也是构建可维护业务逻辑的关键一步。
立即学习“PHP免费学习笔记(深入)”;











