JSON 多维数组值中的对象值(Google GEO 数据)

JSON Object value in multi dimensional array value (Google GEO Data)

我只想要类型为 postal_code 的列表的值 long_name。它在每个地址变化的不同数组 ID 上,否则我会使用这样的东西:

$jsonobj->results[0]->address_components[2]->long_name;

虽然那行不通;(

这是代码,来自 Google GEO 位置 API

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "2565",
               "short_name" : "2565",
               "types" : [ "postal_code", "postal_code_prefix" ]
            },
            {
               "long_name" : "Den Haag",
               "short_name" : "Den Haag",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Den Haag",
               "short_name" : "Den Haag",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Zuid-Holland",
               "short_name" : "ZH",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Nederland",
               "short_name" : "NL",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "2565 Den Haag, Nederland",
         "geometry" : {
            "bounds" : {
...

所以,简而言之,我怎样才能获得 "types == postal_code" 的 "long_name" 值(也许使用 in_array(postal_code, $types)?)。

答案已经给出但想 post 我的函数版本也在这里:

$city          = getAddressDetail($jsonobj, 'locality');
$zipcode       = getAddressDetail($jsonobj, 'postal_code');

function getAddressDetail($jsonobj, $attr){
    // Loop over each result
    foreach ($jsonobj->results as $result) {
        // Loop over each address_component of a given result
        foreach ($result->address_components as $component) {
            // Check for 'postal_code' in the types array
            if (in_array($attr, $component->types, true)) {
                // Extract the 'long_name'
                return $component->long_name;
            }
        }
    }
}

你只需要嵌套几个 foreach 循环然后使用 in_array():

<?php

// Loop over each result
foreach ($jsonobj->results as $result) {
    // Loop over each address_component of a given result
    foreach ($result->address_components as $component) {
        // Check for 'postal_code' in the types array
        if (in_array('postal_code', $component->types, true)) {
            // Extract the 'long_name'
            echo $component->long_name . "\n";
        }
    }
}

如果你想让搜索更通用,你可以提取到一个函数中:

<?php

function find_by_type($obj, $type) {
    $res = [];

    foreach ($obj->results as $result) {
        foreach ($result->address_components as $component) {
            if (in_array($type, $component->types, true)) {
                $res[] = $component->long_name;
            }
        }
    }

    return $res;
}

$res = find_by_type($jsonobj, 'postal_code');

var_dump($res);

如果你真的很喜欢,传入一个 callable 来提取你想要的字段:

function find_by_type($obj, $type, $extractor) {
    $res = [];

    foreach ($obj->results as $result) {
        foreach ($result->address_components as $component) {
            if (in_array($type, $component->types, true)) {
                $res[] = $extractor($component);
            }
        }
    }

    return $res;
}

$res = find_by_type($jsonobj, 'postal_code', function($c) {
    return $c->short_name;
});

var_dump($res);