0

Google Maps APIから返された JSON があり、州、郡、地域、および国のみを取得したいと考えています。

次の簡単なコードを使用して、PHP 経由でこの json を取得しています。

$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=the+address&sensor=true&key=my+api+key';

// make the HTTP request
$data = @file_get_contents($url);

$jsondata = json_decode($data,true);

$data をエコーすると、次のようになります。

{
"results" : [
  {
     "address_components" : [
        {
           "long_name" : "9",
           "short_name" : "9",
           "types" : [ "street_number" ]
        },
        {
           "long_name" : "Hanover Street",
           "short_name" : "Hanover St",
           "types" : [ "route" ]
        },
        {
           "long_name" : "Edinburgh",
           "short_name" : "Edinburgh",
           "types" : [ "locality", "political" ]
        },
        {
           "long_name" : "City of Edinburgh",
           "short_name" : "City of Edinburgh",
           "types" : [ "administrative_area_level_2", "political" ]
        },
        {
           "long_name" : "Scotland",
           "short_name" : "Scotland",
           "types" : [ "administrative_area_level_1", "political" ]
        },
        {
           "long_name" : "United Kingdom",
           "short_name" : "GB",
           "types" : [ "country", "political" ]
        },
        {
           "long_name" : "EH2",
           "short_name" : "EH2",
           "types" : [ "postal_code_prefix", "postal_code" ]
        },
        {
           "long_name" : "Edinburgh",
           "short_name" : "Edinburgh",
           "types" : [ "postal_town" ]
        }
     ]
  }
],
"status" : "OK"
}

私がアクセスしたいのは、多次元配列 *address_components* の内部です。Google からの各 JSON 応答は、毎回同じ数の配列を返すと想定していたので、単純な数値インデックスを使用して必要なデータにアクセスしています。 .

$jsondata['results'][0]['address_components'][4]['long_name']つまり、常に「administrative_area_level_2」の long_name 値が得られると思っていましたが、この場合は「City of Edinburgh」でした。しかし、私は間違っていました。

住所コンポーネントが多い場合と少ない場合があります。つまり、この配列を検索してインデックスを取得する方法が必要です。

それはどのように行われますか?同様に、「administrative_area_level_1」タイプの住所コンポーネントを検索し、その「long_name」値を返すにはどうすればよいですか?

4

2 に答える 2

3

試すことができるのはforeach、結果をループして、必要なデータをチェックすることです。住所コンポーネントの 1 つの中で「administrative_area_level_1」を具体的に探している場合は、type.

このようなもの:

foreach ($jsondata['results'][0]['address_components'] as $comp) {
    //loop through each component in ['address_components']
    foreach ($comp['types'] as $currType){
        //for every type in the current component, check if it = the check
        if($currType == 'administrative_area_level_1'){
            echo $comp['long_name'];
            //Do whatever with the component, print longname, whatever you need
            //You can add $comp into another array to have an array of 'administrative_area_level_1' types
        }
    }
}

コンポーネントレベルでコンポーネントに設定された結果をループ/検索する必要があります。そこから、さらにロジック/解析を実行できる「現在のコンポーネント」のハンドルが得られます。その「現在のコンポーネント」内には、チェックしている「タイプ」があります。

于 2013-02-28T19:07:08.110 に答える
1

関数を使用して配列全体をループし、必要な値が見つかった場合はそれを返すことができます。

$jsondata = json_decode($data, true);

function getAdministrativeAreaLevel2($addresses) {
    if (!is_array($addresses) || empty($addresses)) {
        return; // we need an array with data
    }

    foreach ($addresses as $address) {
        if (!isset($address['address_components']))
            continue; // nothing to look at
        foreach ($address['address_components'] as $compontent) {
            // should be an array with types
            if (is_array($compontent['types']) && !empty($compontent['types'])) {
                foreach ($compontent['types'] as $type) {
                    if ($type == 'administrative_area_level_2') {
                        return $compontent['long_name'];
                    }
                }
            }
        }
    }
}
echo getAdministrativeAreaLevel2($jsondata['results']);
于 2013-02-28T19:07:20.813 に答える