3

我想将来自 google maps html 调用(如下)的位置名称添加到特定的 php 变量,以便我可以 1)将其存储在 mysql 数据库中并 2)将其显示为 echo 语句的一部分(echo $locality)。

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

我已经通过以下方式解码了 json 数据: json_decode($data,true); 陈述。

鉴于多变量数组结构的复杂性,我想深入研究并提取一个特定值(如果存在)。一个例子来帮助解释。

这是为节省空间而缩写的json数据:

{“结果”:[
{ “地址组件
”:[
{
“长名称”:“2917-2981”, “短名称
”:“2917-2981”,
“类型”:[“街道号码”]
},
{“长名称”:“ Runyon Canyon Rd”,
“short_name”:“Runyon Canyon Rd”,
“types”:[“route”]
},
{
“long_name”:“Hollywood Hills”,
“short_name”:“好莱坞山”,
“类型”:[“邻里”,“政治”]
},
{
long_name”:“洛杉矶”
“short_name”:“洛杉矶”,
“types”:[“locality”,“political”]
}
....

我的代码:

...
$data = @file_get_contents($url);
$phpresult = json_decode($data,true);
var_dump($phpresult);

var_dump($phpresult) 显示:

array(2) { ["results"]=> array(8) { [0]=> array(4) { ["address_components"]=> array(8) { [0]=> array(3) { [ "long_name"]=> string(9) "2917-2981" ["short_name"]=> string(9) "2917-2981" ["types"]=> array(1) { [0]=> string( 13) "street_number" } } [1]=> array(3) { ["long_name"]=> string(16) "Runyon Canyon Rd" ["short_name"]=> string(16) "Runyon Canyon Rd" [ "types"]=> array(1) { [0]=> string(5) "route" } } [2]=> array(3) { ["long_name"]=> string(15) "Hollywood Hills" ["short_name"]=> string(15) "Hollywood Hills" ["types"]=> array(2) { [0]=> string(12) "neighborhood" [1]=> string(9) "政治“}} [3]=>数组(3){[“long_name”]=>字符串(11)“洛杉矶” [“short_name”]=>字符串(11)“洛杉矶” [“类型”]= > array(2) { [0]=> string(8) "locality" [1]=> string(9) "political" }...<

我想通过搜索/解析/将值“洛杉矶”存储在变量 $locality 中?条件“type = locality”的数组。

我不想通过使用代码来查找信息:

echo $phpresult['results'][0]['address_components'][3]['long_name'];

因为这假设变量始终是 1) 在数组中的相同位置和 2) 它存在。

任何帮助将非常感激。我还没有找到答案,可能已经阅读(但不完全理解)与该主题相关的每篇文章。

在此先感谢您的帮助。

肖恩

4

2 回答 2

1

你可以用这个模式做一个 preg_match :

|"long_name" : "([^"]*)",\r\n"short_name" : "([^"]*)",\r\n"types" : \[ [^\]]*"locality"|

演示

这将返回一个包含 3 个元素的数组,其中长名称位于索引 1,短名称位于索引 2

或使用循环:

foreach($phpresult['results'][0]['address_components'] as $component){
  if(array_search('location', $component['types']) !== false){
    $location = $component['long_name'];
    break;
  }
}

如果这是为您硬编码,您可以添加另一个循环来检查所有结果。

于 2012-08-03T07:39:37.697 回答
0
foreach($phpresult['results'][0]['address_components'] as $location)
{
    if(in_array("locality" , $location['types']))
    {
        $locality[] = $location['long_name'];
    }
}

print_r($locality);

每个位置的数组有 3 个键:long_name、short_name 和 types。Types 是一个数组,因此,如果其中有一个“locality”值,则types array 获取该long_name位置的值并存储它。

编辑:此函数将存储位置类型的所有 long_names,而不仅仅是第一个。为了只获取第一个位置的 long_name ,请在$locality[] = ....

于 2012-08-03T07:56:39.013 回答