【问题标题】:Get the right values from a JSON array using Google's Geocoding API使用 Google 的地理编码 API 从 JSON 数组中获取正确的值
【发布时间】:2015-10-23 13:38:42
【问题描述】:

我正在使用 Google Geocoding APIPHP (cURL) 来获取 JSON 数组。 这一切都很好。 问题是不是每个输出都是一样的。

例子:

我有两个地址:

  1. 阿姆斯特丹 1 号大坝
  2. 柏林选帝侯大街 1 号

对于阿姆斯特丹地址,$array['results'][0]['address_components'] 的计数为 8,柏林为 7。

JSON 输出:

阿姆斯特丹:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "1",
               "short_name" : "1",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Dam",
               "short_name" : "Dam",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Centrum",
               "short_name" : "Centrum",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Amsterdam",
               "short_name" : "Amsterdam",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Amsterdam",
               "short_name" : "Amsterdam",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Noord-Holland",
               "short_name" : "NH",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Nederland",
               "short_name" : "NL",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "1012 JS",
               "short_name" : "1012 JS",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Dam 1, 1012 JS Amsterdam, Nederland",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 52.3740904,
                  "lng" : 4.8951464
               },
               "southwest" : {
                  "lat" : 52.37303319999999,
                  "lng" : 4.893589
               }
            },
            "location" : {
               "lat" : 52.3735618,
               "lng" : 4.8943677
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 52.37491078029149,
                  "lng" : 4.895716680291502
               },
               "southwest" : {
                  "lat" : 52.3722128197085,
                  "lng" : 4.893018719708498
               }
            }
         },
         "place_id" : "ChIJ46bYaccJxkcRR1k-7Pl25Kg",
         "types" : [ "premise" ]
      }
   ],
   "status" : "OK"
}

柏林:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "1",
               "short_name" : "1",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Kurfürstendamm",
               "short_name" : "Kurfürstendamm",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Bezirk Charlottenburg-Wilmersdorf",
               "short_name" : "Bezirk Charlottenburg-Wilmersdorf",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Berlin",
               "short_name" : "Berlin",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Berlin",
               "short_name" : "Berlin",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Duitsland",
               "short_name" : "DE",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "10719",
               "short_name" : "10719",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Kurfürstendamm 1, 10719 Berlin, Duitsland",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 52.50440769999999,
                  "lng" : 13.3337799
               },
               "southwest" : {
                  "lat" : 52.5043971,
                  "lng" : 13.3337737
               }
            },
            "location" : {
               "lat" : 52.50440769999999,
               "lng" : 13.3337737
            },
            "location_type" : "RANGE_INTERPOLATED",
            "viewport" : {
               "northeast" : {
                  "lat" : 52.50575138029149,
                  "lng" : 13.3351257802915
               },
               "southwest" : {
                  "lat" : 52.5030534197085,
                  "lng" : 13.3324278197085
               }
            }
         },
         "partial_match" : true,
         "place_id" : "EixLdXJmw7xyc3RlbmRhbW0gMSwgMTA3MTkgQmVybGluLCBEZXV0c2NobGFuZA",
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}

如您所见,国家和邮政编码索引不同(国家:6 和 5,邮政编码 7 和 6)

当我想显示两个城市的街道、门牌号、邮政编码、城市和国家时,如下所示:

echo 'Street = '.$array['results'][0]['address_components'][1]['long_name'].'<br />';
echo 'Housenumber = '.$array['results'][0]['address_components'][0]['long_name'].'<br />';
echo 'Postalcode = '.$array['results'][0]['address_components'][7]['long_name'].'<br />';
echo 'City = '.$array['results'][0]['address_components'][3]['long_name'].'<br />';
echo 'Country = '.$array['results'][0]['address_components'][6]['long_name'].'<br />';

显示如下输出:

阿姆斯特丹:

Street = Dam
Housenumber = 1
Postalcode = 1012 JS
City = Amsterdam
Country = Netherlands

柏林:

Street = Kurfürstendamm
Housenumber = 1

Notice: Undefined offset: 7 in .... on line ....
Postalcode = 
City = Berlin
Country = 10719

所以问题是,我怎样才能在"address_components" 数组中获得"types" 中的"long_name"

或者也许有更好的方法?

【问题讨论】:

    标签: php geocoding google-geocoding-api


    【解决方案1】:

    您可以尝试以下代码将 JSON 响应转换为以地址组件作为键的数组:

    function convertAddress($json)
    {
    
        $data = json_decode($json);
    
        $address = array();
    
        foreach($data['results']['address_components'] AS $_component){
    
            $key = array_values($_component['types']);
            $address[$key[0]] = $_component;
    
        }
    
        return $address;
    
    }
    

    这对我来说非常适合您的测试数据,然后您可以像这样访问数据:

    $address = convertAddress($berlin_address);
    print $address['post_code']['long_name'];
    

    请注意,我只处理了 JSON 的 address_components 部分,但其余部分应该很容易在该方法中使用。

    【讨论】:

    • 不用担心,随时!
    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多