多维JSON数组数据提取求助:PHP无法获取嵌套数组内的数据
如何从嵌套JSON数组中提取PHP数据
兄弟,我太懂这种“明明看着简单却卡了一整天”的憋屈感了!别慌,咱们一步步拆解这个问题~
首先,先把你提供的JSON片段补全成一个可测试的完整版本(方便演示):
{ "ordens_de_servico": [ { "oser_numero_os": 23932944, "oser_nome_solicitante": "ED PI - CAMPO MAIOR", "oser_dt_abertura": "27/03/2018", "oser_pontos_refer_endereco": null, "oser_observacoes": "示例工单备注" } ] }
核心思路:先转PHP结构,再访问嵌套元素
PHP处理JSON的核心是用json_decode()把JSON字符串转成PHP能识别的数组或对象,然后根据嵌套层级访问对应数据。下面给你两种最常用的处理方式:
方式1:转关联数组处理(更直观)
给json_decode()传第二个参数true,会把JSON转为关联数组,直接用键名访问:
// 假设你的原始JSON字符串存在$json变量中 $json = '{ "ordens_de_servico": [ { "oser_numero_os": 23932944, "oser_nome_solicitante": "ED PI - CAMPO MAIOR", "oser_dt_abertura": "27/03/2018", "oser_pontos_refer_endereco": null, "oser_observacoes": "示例工单备注" } ] }'; // 转为关联数组 $dados = json_decode($json, true); // **重点**:ordens_de_servico是一个数组(里面可能有多个工单),所以要先取数组元素,再取字段 $numero_os = $dados['ordens_de_servico'][0]['oser_numero_os']; $solicitante = $dados['ordens_de_servico'][0]['oser_nome_solicitante']; // 输出测试 echo "工单编号:{$numero_os}\n"; echo "申请人:{$solicitante}";
方式2:转对象处理
如果习惯用对象语法,不传第二个参数(默认false)会转为stdClass对象,用->访问属性:
$json = '{ "ordens_de_servico": [ { "oser_numero_os": 23932944, "oser_nome_solicitante": "ED PI - CAMPO MAIOR", "oser_dt_abertura": "27/03/2018", "oser_pontos_refer_endereco": null, "oser_observacoes": "示例工单备注" } ] }'; // 转为对象 $dados = json_decode($json); // **重点**:同样要注意ordens_de_servico是数组,用[0]取第一个工单 $numero_os = $dados->ordens_de_servico[0]->oser_numero_os; $solicitante = $dados->ordens_de_servico[0]->oser_nome_solicitante; echo "工单编号:{$numero_os}\n"; echo "申请人:{$solicitante}";
你可能踩过的坑
- 忽略
ordens_de_servico是数组:很多人会直接写$dados['ordens_de_servico']['oser_numero_os'],忘记它是包含多个工单的数组,必须加索引(比如[0])或者遍历。 - JSON解析失败:如果你的JSON格式有问题(比如截断、引号不匹配),
json_decode()会返回null。可以用下面的代码排查错误:
$dados = json_decode($json, true); if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON解析出错:" . json_last_error_msg(); }
- 多个工单需要遍历:如果
ordens_de_servico里有多个工单,用循环批量处理:
foreach ($dados['ordens_de_servico'] as $ordem) { echo "工单编号:{$ordem['oser_numero_os']},申请人:{$ordem['oser_nome_solicitante']}\n"; }
如果你的PHP尝试代码还有其他特殊情况,贴出来我再帮你排查!
内容的提问来源于stack exchange,提问作者Israyane Nayara
相关产品推荐
相关产品推荐

