
本文介绍如何从包含多个 json 字符串的 php 数组中,精准定位并提取出某个字段值为 "1" 的完整对象(如 company、facilities 等字段),通过 json 解析、数组遍历与条件判断实现目标结果。
本文介绍如何从包含多个 json 字符串的 php 数组中,精准定位并提取出某个字段值为 "1" 的完整对象(如 company、facilities 等字段),通过 json 解析、数组遍历与条件判断实现目标结果。
在实际开发中,我们常遇到以 JSON 字符串形式存储在数组中的配置或权限数据。例如以下场景:一个二维权限数组中,每个元素是表示模块权限的 JSON 字符串,需找出其中至少有一个字段(如 "company" 或 "facilities")值为 ["1"] 的完整记录。
但需注意:原始问题描述存在歧义——标题要求“比较 Array[0] 和 Array[1]”,而示例期望输出却是 Array[1] 本身(因其已含多个 "1" 值字段)。因此,核心逻辑应为:遍历数组,对每个 JSON 字符串进行解码,检查其任意(或指定)键对应的值是否为 ["1"],并收集匹配项。
以下是完整、健壮的实现方案:
<?php
// 原始数据:含 JSON 字符串的数组
$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"]}',
];
$result = [];
foreach ($array as $index => $jsonStr) {
$decoded = json_decode($jsonStr, true);
// 安全检查:确保 JSON 解析成功且为关联数组
if (json_last_error() !== JSON_ERROR_NONE || !is_array($decoded)) {
continue;
}
// 方式一:查找「任意字段」值为 ["1"] 的对象(满足任一即命中)
foreach ($decoded as $key => $value) {
if (is_array($value) && count($value) === 1 && $value[0] === '1') {
$result[] = $decoded;
break; // 找到一个即加入,避免重复添加
}
}
}
// 输出结果(格式化 JSON 便于阅读)
echo "<pre>";
print_r($result);
echo "</pre>";
?>✅ 输出示例:
立即学习“PHP免费学习笔记(深入)”;
Array
(
[0] => Array
(
[tranc] => Array([0] => 2)
[report] => Array([0] => 2)
[company] => Array([0] => 1)
[facilities] => Array([0] => 1)
[area] => Array([0] => 1)
[zone] => Array([0] => 2)
)
)? 关键说明与注意事项:
- JSON 解析必须校验:使用 json_decode($str, true) 转为关联数组,并始终检查 json_last_error(),避免因非法 JSON 导致静默失败;
- 值匹配需严格:["1"] 是字符串数组,不可用 == 1 或 === 1 直接比较,应校验 is_array($v) && $v[0] === '1';
- 灵活扩展性:若只需检查特定字段(如仅 company 和 facilities),可将键名预定义为 $targetKeys = ['company', 'facilities'];,再循环比对;
- 性能提示:对于大数据量,建议提前 break 或使用 array_filter() + 匿名函数提升可读性。
? 进阶建议:若需返回原始 JSON 字符串(而非解码后数组),可直接保存 $jsonStr 到 $result;若需合并多个匹配项的差异字段,可进一步使用 array_diff_assoc() 或自定义合并逻辑。
掌握此模式,即可高效处理权限比对、配置筛选、多版本数据差异提取等典型业务场景。











