PHP разбор многомерного массива json любой глубины на основе ключа - PullRequest
1 голос
/ 03 августа 2011

У меня есть массив json, как показано ниже, я хочу проанализировать массив и получить значение для соответствующего ключа. Например, SubAdministrativeAreaName. Я мог бы проанализировать его как.

["AddressDetails"]['Country']['AdministrativeArea'] ['SubAdministrativeArea']['SubAdministrativeAreaName']

но структура массива не является фиксированной, она может содержать некоторые другие ключи, в которые может быть заключено «SubAdmininstrativeArea».

Мне нужна функция php, которая будет искать конкретное имя ключа через многомерный массив jsonлюбой глубины

Буду признателен за любую помощь.

"AddressDetails": {
    "Accuracy": 6,
    "Country": {
        "AdministrativeArea": {
            "AdministrativeAreaName": "Maharashtra",
            "SubAdministrativeArea": {
                "SubAdministrativeAreaName": "Parbhani",
                "Thoroughfare": {
                    "ThoroughfareName": "SH217"
                }
            }
        },
        "CountryName": "India",
        "CountryNameCode": "IN"
    }
}

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

ОК, другой ответ основан на комментариях ниже:

function array_key_search_deep($needle, $haystack) {
    $value = NULL;
    if(isset($haystack[$needle])) {
        $value = $haystack[$needle];
    } else {
        foreach($haystack as $node) {
            if(is_array($node)) {
                $value = array_key_search_deep($needle, $node);
                if(!is_null($value)) {
                    break;
                }
            }
        }
    }
    return $val;
}

Старый ответ

Это позволит вам пройти по неизвестному пути в любом дереве массива:

$path = array('AddressDetails', 'Country', 'AdministrativeArea', 'SubAdministrativeArea', 'SubAdministrativeAreaName');

$node = $json_object;

foreach($path as $path_index) {
    if(isset($node[$path_index])) {
        $node = $node[$path_index];
    } else {
        $node = NULL;
    }
}

echo($node);
1 голос
/ 03 августа 2011

Спасибо, ребята, то, что я сделал, было таким решением

I finally found a simple solution myself 

For eg) To get "ThoroughfareName" make a call 
recursive_array_search($json_array,'ThoroughfareName') ;



         function recursive_array_search($arr,$jackpot)
         {
          foreach ($arr as $key => $value)
          { 
            if(is_array($value))
            {
                $val=recursive_array_search($value,$jackpot) ;
                return $val;
            }
            else
            {
                    if($key==$jackpot)
                    return $value;
            }
          }
         }


0 голосов
/ 03 августа 2011

Вы можете использовать JSONPath (XPath для JSON)

http://goessner.net/articles/JsonPath/

(например, с выражением "$ .. SubAdministrativeAreaName")

РЕДАКТИРОВАТЬ: Не проверял, не уверен, насколько это надежно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...