2012-10-05 57 views
3

我想从他们的邮政编码(加拿大/美国)的谷歌地理编码中获得用户所在的城市,州/省,国家/地区。我检索数据为JSON:https://developers.google.com/maps/documentation/geocoding/#JSONGoogle地理编码。解析JSON问题

问题是,并不总是相同的数量/顺序的'address_components'。我正在使用就像:$geocodedinfo['results'][0]['address_components'][3]['short_name']; 但我很快意识到,这并不总是省/国家,因为有时谷歌会在'address_components'下添加一个额外的元素。

有没有一种方法来解析结果只是为了我需要的细节(即:城市,州/省,国家)?

编辑当我得到它json_decode($result, true)

Array 
(
[results] => Array 
    (
     [0] => Array 
      (
       [address_components] => Array 
        (
         [0] => Array 
          (
           [long_name] => V2X 2P6 
           [short_name] => V2X 2P6 
           [types] => Array 
            (
             [0] => postal_code 
            ) 

          ) 

         [1] => Array 
          (
           [long_name] => Maple Ridge 
           [short_name] => Maple Ridge 
           [types] => Array 
            (
             [0] => locality 
             [1] => political 
            ) 

          ) 

         [2] => Array 
          (
           [long_name] => Maple Ridge 
           [short_name] => Maple Ridge 
           [types] => Array 
            (
             [0] => administrative_area_level_3 
             [1] => political 
            ) 

          ) 

         [3] => Array 
          (
           [long_name] => Greater Vancouver Regional District 
           [short_name] => Greater Vancouver Regional District 
           [types] => Array 
            (
             [0] => administrative_area_level_2 
             [1] => political 
            ) 

          ) 

         [4] => Array 
          (
           [long_name] => British Columbia 
           [short_name] => BC 
           [types] => Array 
            (
             [0] => administrative_area_level_1 
             [1] => political 
            ) 

          ) 

         [5] => Array 
          (
           [long_name] => Canada 
           [short_name] => CA 
           [types] => Array 
            (
             [0] => country 
             [1] => political 
            ) 

          ) 

        ) 

       [formatted_address] => Maple Ridge, BC V2X 2P6, Canada 
       [geometry] => Array 
        (
         [bounds] => Array 
          (
           [northeast] => Array 
            (
             [lat] => 49.2214351 
             [lng] => -122.6577849 
            ) 

           [southwest] => Array 
            (
             [lat] => 49.219268 
             [lng] => -122.663613 
            ) 

          ) 

         [location] => Array 
          (
           [lat] => 49.2202679 
           [lng] => -122.660587 
          ) 

         [location_type] => APPROXIMATE 
         [viewport] => Array 
          (
           [northeast] => Array 
            (
             [lat] => 49.2217005303 
             [lng] => -122.6577849 
            ) 

           [southwest] => Array 
            (
             [lat] => 49.2190025697 
             [lng] => -122.663613 
            ) 

          ) 

        ) 

       [types] => Array 
        (
         [0] => postal_code 
        ) 

      ) 

    ) 

[status] => OK 
) 
+0

我使用的是XML而不是JSON,但我必须迭代,直到找到需要的数据。 –

+0

我有同样的问题,但冷杉我的情况下,我最需要的address_components所以我用foreach()得到我想要的,忘记其余的。 –

+0

@ayeshk是否有可能遍历数组,并获取['long_name']值WHERE ['types'] ['0'] =='country'for isntance?我从来没有这样做过。 – cantaffordretail

回答

4

你将不得不遍历结果我居然解码JSON。
大部分相关的PHP函数都不支持多维数组,并且无论如何都会循环。

你可能会想是这样的:

foreach ($geocodedinfo["results"] as $result) { 
    foreach ($result["address_components"] as $address) { 
     // Repeat the following for each desired type 
     if (in_array("country", $address["types"])) { 
      $country = $address["long_name"]; 
     } 
    } 
} 
+0

这正是我所需要的。现在我知道in_array函数。谢谢。 – cantaffordretail

0

尝试寻找这个,http://php.net/manual/en/control-structures.foreach.php它是遍历数组,你可以这样做,

foreach ($result['results'][0]['address_components'] as $key => $val) 
    { 
    if (in_array('country', $result['results'][0]['address_components'][$key]['types'][0])) 
    { 
    echo $result['results'][0]['address_components'][$key]['long_name']; 
    } 
} 

类似的东西应该工作

+0

这将无法捕捉'types'中的值的顺序不同,即'[“political”,“country”] - 您将要使用'in_array'。 – Sara

+0

编辑我的答案来解决这个问题。 – King

0

您可以通过循环运行结果foreach并获取要查找的数据。

我对Google类型的含义进行了最佳猜测,我可能会忽略这些。

$translate = array(
    'locality' => 'city', 
    'administrative_area_level_3' => 'area', // not sure what this one is 
    'administrative_area_level_2' => 'county', // regional district ? 
    'administrative_area_level_1' => 'state', // province 
    'country' => 'country', 
    'postal_code' => 'zip', // postal code 
); 

$address_components = array(); 
foreach ($geocodedinfo['results'][0]['address_components'] as $component) { 
    $address_components[$translate[$component['type'][0]]] = $component['long_name']; 
} 

var_dump($address_components); 
-1

//解析JSON响应 $jsondata = json_decode($data,true); $results = $jsondata['results'][0]; $addr =$results['formatted_address'];

这允许您访问长格式的地址

326伦敦路,纽伯里,伯克希尔,西伯克郡RG14 2DA,英国