Получите правильные значения из массива JSON с помощью Google Geocoding API

Я использую Google Geocoding API, а также PHP (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

Итак, вопрос в том, как я могу получить "long_name" в "types" в "address_components" массив?

Или, может быть, есть даже лучшие способы?

0

Решение

Вы можете попробовать следующий код ниже, чтобы преобразовать 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'];

Обратите внимание, что я работал только над частью address_components в JSON, а остальное должно быть легко вписано в метод.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]