谷歌地理编码。解析JSON问题

时间:2012-10-05 22:08:19

标签: php json geocode

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

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

有没有办法根据我需要的细节(即:城市,州/省,国家/地区)解析结果?

编辑我收到JSON后实际解码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
)

4 个答案:

答案 0 :(得分:4)

你将不得不循环结果。
大多数相关的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"];
        }
    }
}

答案 1 :(得分: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']; 
    } 
}

这样的事情应该有效

答案 2 :(得分: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);

答案 3 :(得分:-1)

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

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

326 London Road,Newbury,Berkshire,West Berkshire RG14 2DA,UK