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);
我只想要类型为 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);