Я пытаюсь переформатировать адреса.
Поэтому я хочу использовать Google Geocoding API.
вот вывод
{
"results" : [
{
"address_components" : [
{
"long_name" : "301",
"short_name" : "301",
"types" : [ "subpremise" ]
},
{
"long_name" : "880",
"short_name" : "880",
"types" : [ "street_number" ]
},
{
"long_name" : "N Street",
"short_name" : "N St",
"types" : [ "route" ]
},
{
"long_name" : "South Addition",
"short_name" : "South Addition",
"types" : [ "neighborhood", "political" ]
},
{
"long_name" : "Anchorage",
"short_name" : "Anchorage",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Anchorage",
"short_name" : "Anchorage",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "Alaska",
"short_name" : "AK",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "99501",
"short_name" : "99501",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "880 N Street #301, Anchorage, AK 99501, USA",
"geometry" : {
"location" : {
"lat" : 61.21391800000001,
"lng" : -149.908357
},
"location_type" : "ROOFTOP",
"viewport" : {
"northeast" : {
"lat" : 61.21526698029151,
"lng" : -149.9070080197085
},
"southwest" : {
"lat" : 61.2125690197085,
"lng" : -149.9097059802915
}
}
},
"partial_match" : true,
"types" : [ "subpremise" ]
}
],
"status" : "OK"}
Как получить номер улицы, адрес улицы, номер люкс (если есть), город, штат, почтовый индекс.
Меня смущает то, что address_component имеет разные компоненты. Как я могу сказать, что означает каждый из них?
Я думал, что могу сделать что-то подобное, чтобы получить то, что мне нужно
<?php
$obj = json_decode($json, true);
$c = $obj['results'][0]['address_components'];
echo '</pre>';
echo 'BUILDING NAME: ' . $c[1]['long_name'] . "<br>\n";
echo 'BUILDING NUMBER: ' . $c[2]['long_name'] . "<br>\n";
echo 'STREET NAME: ' . $c[3]['long_name'] . "<br>\n";
echo 'CITY: ' . $c[5]['long_name'] . "<br>\n";
echo 'COUNTY: ' . $c[6]['long_name'] . "<br>\n";
echo 'STATE: ' . $c[7]['short_name'] . "<br>\n";
echo 'COUNTRY: ' . $c[8]['short_name'] . "<br>\n";
echo 'POSTAL CODE: ' . $c[9]['short_name'] . "<br>\n";
?>
Но это не будет работать для всех адресов. используя приведенный выше адрес здесь мой вывод. как вы можете сказать, этикетки не соответствуют данным.
BUILDING NAME: 880
BUILDING NUMBER: N Street
STREET NAME: South Addition
CITY: Anchorage
COUNTY: Alaska
STATE: US
COUNTRY: 99501
Как я могу получить желаемые результаты, чтобы быть правильными каждый раз?
Мое предположение, что мне как-то придется проверять значение типа, но я не уверен в том, как и какие правила мне нужно рассмотреть.
Вот быструю функцию, которую я бросил вместе, и вот играть на скрипке:
function getAddress($elements){
$addr = [];
foreach($elements as $e){
if(isset($e['types']) && in_array("street_number",$e['types'])) $addr['street_number'] = $e['long_name'];
if(isset($e['types']) && in_array("street_number",$e['types'])) $addr['route'] = $e['long_name'];
if(isset($e['types']) && in_array("administrative_area_level_2",$e['types'])) $addr['city'] = $e['long_name'];
}
return $addr;
}
Я не сделал всю работу для вас, хотя. Это просто, чтобы дать вам пример того, как это сделать. Вы должны будете отредактировать это, чтобы получить остальную информацию.
Пример использования:
$obj = json_decode($json, true);
$c = $obj['results'][0]['address_components'];
$address_parts = getAddress($c);
Выводит простой массив:
array(3) { ["street_number"]=> string(3) "880" ["route"]=> string(3) "880" ["city"]=> string(9) "Anchorage" }
Других решений пока нет …