【问题标题】:parse json data from google maps html call to mysql database using php使用 php 将 json 数据从 google maps html 调用解析到 mysql 数据库
【发布时间】:2012-08-01 05:14:19
【问题描述】:

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

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

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

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

为了节省空间,这里是 json 数据的缩写:

{ “结果”:[
{
“地址组件”:[
{
"long_name" : "2917-2981",
"short_name" : "2917-2981",
“类型”:[“街道号码”]
},
{ "long_name" : "Runyon Canyon Rd",
"short_name" : "Runyon Canyon Rd",
“类型”:[“路线”]
},
{
"long_name" : "好莱坞山",
"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) "好莱坞山" ["short_name"]=> 字符串(15) "好莱坞山" ["types"]=> 数组(2) { [0]=> 字符串(12) "neighborhood" [1]=> 字符串(9 ) "政治" } } [3]=> array(3) { ["long_name"]=> string(11) "洛杉矶" ["short_name"]=> string(11) "洛杉矶" ["types"]=> array(2) { [0]=> string(8) "locality" [1]=> string(9) "political" }...

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

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

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

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

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

提前感谢您的帮助。

肖恩

【问题讨论】:

  • 我认为数组格式保持不变,所以上面应该可以正常工作。只是一个想法 - 也许您需要以 XML 格式检索信息并使用 xpath。或者,如果您希望坚持上述做法,您可能需要创建一个函数,该函数循环遍历此数据数组并检查关键“位置”等

标签: php mysql json parsing


【解决方案1】:

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

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

Demo

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

或者使用循环:

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

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

【讨论】:

  • 太好了。谢谢。我实际上创建了一个 foreach 循环并在我发布它之后发现了它,但我的代码似乎是服务器密集型的。我有 3 个 foreach 循环(嵌套:我认为这是正确的术语)和一个 if 语句。您认为哪个是最高效且服务器密集度最低的?另外,其中一种或另一种被认为是最佳实践吗?我在此评论中引用了您的上述两个选项以及我的选项。
  • 取决于返回数组的大小。正则表达式相当慢,但解析 LARGE json 答案也需要时间。老实说,我不知道在你的情况下什么更好,但我会使用正则表达式。
【解决方案2】:
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 是一个数组,因此,如果 types array 中存在“locality”值 获取该位置的long_name 并将其存储。

编辑:此函数将存储具有位置类型的位置的所有长名称, 不只是第一个。 为了只获取第一个位置的 long_name,请在 $locality[] = ... 之后添加“break”。

【讨论】:

  • 太好了。如果我想向数组中添加其他变量,代码将是: $locality[] = $location[types][0]; AND $locality[] = $location['short_name'];?
  • 你应该这样做:$locality[] = array( 'type' => $location['types'][0], 'short_name' => $location['short_name'] ); 这样,数组中的每个键都是一个位置。像这样访问它:$locality[X]['type']$locality[X]['short_name']。当 x 为键号时(从 0 到 ...)
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 2011-02-11
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多