之前我们讲解过使用 javascript 获取 json 数据节点路径的问题, 今天我们更进一步, 讲解下 php 获取 json 数据所有的节点路径
- <?php
- function iterTree($data) {
- $retData = array();
- $data = json_decode($data, true);
- if (!is_array($data) && empty($data)) {
- echo 'error !' ."n";
- } else {
- $queue = array();
- foreach ($data as $field => $value) {
- $queue[] = $field;
- }
- $head = 0;
- $tail = count($queue);
- while ($head < $tail) {
- $field = $queue[$head++];
- $path = explode("/", $field);
- $tmpData = &$data;
- foreach ($path as $key => $ph) {
- $tmpData = &$tmpData[$ph];
- }
- if (is_array($tmpData) && !empty($tmpData)) {
- $newField = $field;
- foreach ($tmpData as $curField => $curValue) {
- $newField = $field . '/' . $curField;
- $queue[$tail++] = $newField;
- }
- } else {
- $retData[] = $field;
- }
- }
- }
- return $retData;
- }
- // 测试数据
- $data = file_get_contents("http://restapi.ele.me/v1/restaurants?extras[]=food_activity&extras[]=restaurant_activity&extras[]=certification&fields[]=id&fields[]=name&fiel
- ds[]=phone&fields[]=promotion_info&fields[]=name_for_url&fields[]=flavors&fields[]=is_time_ensure&fields[]=is_premium&fields[]=image_path&fields[]=rating&fie
- lds[]=is_free_delivery&fields[]=minimum_order_amount&fields[]=order_lead_time&fields[]=is_support_invoice&fields[]=is_new&fields[]=is_third_party_delivery&fields[%
- 5D=is_in_book_time&fields[]=rating_count&fields[]=address&fields[]=month_sales&fields[]=delivery_fee&fields[]=minimum_free_delivery_amount&fields[]=minimum_order_des
- cription&fields[]=minimum_invoice_amount&fields[]=opening_hours&fields[]=is_online_payment&fields[]=status&fields[]=supports&fields[]=in_delivery_area&geohash=wx4g07
- j0w1v7&is_premium=0&limit=1000&offset=24&type=geohash");
- $ret = iterTree($data);
- print_r($ret);
来源: https://www.php1.cn/detail/php-482bd3512a.html