【问题标题】:Getting Purely Associative Array from JSON data从 JSON 数据中获取纯关联数组
【发布时间】:2014-08-27 18:14:03
【问题描述】:

我正在尝试使用这些 URL 返回的 JSON:

http://maps.googleapis.com/maps/api/geocode/json?latlng=12.0,12.0&sensor=false

http://maps.googleapis.com/maps/api/geocode/json?latlng=39.76144296429947,-104.8011589050293&sensor=false

这是我所做的:

$url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=12.0,12.0&sensor=false';
$data = json_decode( file_get_contents( $url ), true );
print_r( $data );

这是输出:

Array (
   [0] => Array (
       [address_components] => Array (
           [0] => Array (
               [long_name] => Chungul Jabarari-Dabalam-Jajere Road
               [short_name] => Chungul Jabarari-Dabalam-Jajere Road
               [types] => Array ( [0] => route ) )
           [1] => Array (
               [long_name] => Yobe [short_name] => Yobe
               [types] => Array (
                   [0] => administrative_area_level_1
                   [1] => political ) )
           [2] => Array (
               [long_name] => Nigeria
               [short_name] => NG
               [types] => Array (
                    [0] => country
                    [1] => political ) )
 ....

如您所见,address_components[0] 之下,这使得在数组数量未知时很难使用此结果集。

假设我想获得administrative_area_level_2,这是美国的县,但在尼日利亚显然不存在?

假设我想访问美国的['results'][0]['address_components'][6],但尼日利亚的['results'][0]['address_components'][3]

我要求的是当子数组的数量不可靠时访问该数组中每个数据元素的有效方法。

(或者更好地解码 JSON 以生成一个没有这些无用索引并且只是一个纯关联数组的数组。)

【问题讨论】:

  • 使用var_dump检查$data;也就是说,$data 现在包含一个 normal PHP 数组/映射。由于 JSON 只是 文本标记,因此不再涉及 “JSON”。当提出此类问题时,请确保在问题本身中包含一个最小且相关的示例(重现行为/问题)。
  • 它不能作为json解码返回一个对象。你不能把它当作数组处理
  • @user2864740 和其他人,更改了问题以希望更好地解释问题。
  • stackoverflow.com/questions/8727981/…。行政区域级别 2 之类的东西在所有国家/地区都没有固定的定义。您想基于此查找的原因是什么?
  • 当您不知道 json 的结构时,您需要实现递归逻辑来解析该数据。它应该检查它是一个数组还是一个值

标签: php json


【解决方案1】:

如果administrative_area_level_2 存在,这将返回名称,如果不存在,则返回“N/A”。请注意,这可能有点效率低下(循环和检查可能不存在的东西),但它很可能会像这样的东西一样好。

function getAdminAreaLevel2($data)
{
    foreach($data['results'][0]['address_components'] as $component)
    {
        if(in_array("administrative_area_level_2", $component['types']))
        {
            return $component['long_name'];
        }
    }

    return "N/A";
}

echo getAdminAreaLevel2($firstData);
echo "\r\n";
echo getAdminAreaLevel2($secondData);

DEMO

【讨论】:

  • 谢谢,但实际上国家只是一个例子。如果我想获得administrative_area_level_2 如果它存在怎么办(它显然不在尼日利亚)。无论address_components 中有多少数组,我都想要一种有效的数据访问方式
  • 你真的应该把你想要的东西放在你的问题中。否则我们只是在浪费时间。
  • 对不起,这不是我的意图。你的回答确实有效,但它只适用于获得国家,我举了一个(坏的)例子。我很抱歉。
  • 谢谢这个答案确实有效。我仍然希望出现更灵活的方法。
  • 以何种方式更灵活?我很乐意更新,但就目前而言,您的要求/规格似乎相当模糊。
【解决方案2】:
$data = json_decode($url,true);

$address_component = false;
foreach($data['results'] as $value) {

   if(isset($value['address_components'])) {

        $address_component = $value['address_components'];
        break;

    }
}
if($address_component) {
    echo $address_component[6]['long_name'];
}

【讨论】:

  • 这仅在位置位于美国时有效。正如我在问题中所说,例如,要将该国置于尼日利亚的位置,它将是address_components[3]。因此,此解决方案不适用于所有位置。
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
相关资源
最近更新 更多