PHP如何获取JSON数据中的所有键名与对应值?
问题核心
你现有代码的问题在于,$json->data->after是一个索引数组,每一个元素都是仅包含单组键值对的对象。你第一层遍历拿到的$key是索引数组的下标(0、1、2...),第二层遍历时只捕获了值,没有捕获对应的键名,所以无法拿到google.com这类域名键。
方案1:JSON解析为关联数组(推荐)
在json_decode时传入第二个参数true,将整个JSON结构直接解析为关联数组,遍历的时候直接同时获取键和值即可,代码如下:
<?php // 第二个参数传true,JSON解析为关联数组 $json = json_decode('{ "data": { "after": [{ "google.com": "35" }, { "yahoo.com": "10" }, { "worldi.ir": "30" }, { "cnn.com": "554" }, { "scio.ir": "887" }], "before": [{ "bbc.com": "44" }, { "rtl.com": "15" }, { "quran.com": "9" }, { "lap.com": "12" }, { "search.com": "13" }] } }', true); // 遍历after数组下的所有条目 foreach($json['data']['after'] as $item) { // 同时遍历每个条目的键(域名)和值(数值) foreach($item as $domain => $value) { echo "{$domain}: {$value}<br/>"; } } // 若需要获取before下的键值,同理遍历$json['data']['before']即可 ?>
输出结果:
google.com: 35 yahoo.com: 10 worldi.ir: 30 cnn.com: 554 scio.ir: 887
方案2:保留原对象解析逻辑
如果不想修改json_decode的参数,保持原对象解析格式,可以调整遍历逻辑如下:
<?php $json = json_decode('{ "data": { "after": [{ "google.com": "35" }, { "yahoo.com": "10" }, { "worldi.ir": "30" }, { "cnn.com": "554" }, { "scio.ir": "887" }], "before": [{ "bbc.com": "44" }, { "rtl.com": "15" }, { "quran.com": "9" }, { "lap.com": "12" }, { "search.com": "13" }] } }'); foreach($json->data->after as $item) { // 将单个对象转为数组后同时遍历键值 foreach((array)$item as $domain => $value) { echo "{$domain}: {$value}<br/>"; } } ?>
输出结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者Majid Koohi
相关产品推荐
相关产品推荐

