2012-08-03 105 views
3

我想從谷歌地圖HTML調用(下面)添加地點名稱到一個特定的PHP變量,以便我可以1)將其存儲在MySQL數據庫中2)將它顯示爲echo語句的一部分(echo $ locality)。 json_decode($的數據,真實);:從谷歌地圖解析json數據使用php調用mysql數據庫

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

我已經通過解碼的JSON數據聲明。

考慮到多變量數組結構的複雜性,如果它存在,我想潛入並提取特定值。一個幫助解釋的例子。

這裏被簡寫爲JSON數據以節省空間:

{ 「結果」:[
{
「address_components」:[
{
「LONG_NAME」:「2917年至2981年「,
」short_name「:」2917-2981「,
」types「:[」street_number「]
},
{ 「LONG_NAME」: 「魯尼恩峽谷RD」,
「SHORT_NAME」: 「魯尼恩峽谷RD」,
「類型」:[ 「路線」]
},
{
「LONG_NAME」:「好萊塢山」,
「簡稱的」: 「好萊塢山」,
「類型」: 「鄰里」, 「政治」]
},
{
LONG_NAME」: 「洛杉磯」
「簡稱的」: 「洛杉磯」,
「類型」: 「局部性」, 「政治」]
}
....

我的代碼:

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

的var_dump($ phpresult)顯示器:

陣列(2){[ 「結果」] =>數組(8){[0] =>數組(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)峽谷Rd「[」short_name「] => string(16)」Runyon Canyon Rd「[」types「] => array(1){[0] => string(5)」route「}} [2] =>數組(3){[「long_name」] =>字符串(15)「Hollywood Hills」[「short_name」] =>字符串(15)「Hollywood Hills」[「types」] => array(2){[ => string(12)「neighborhood」[1] => string (9)「political」}} [3] => array(3){[「long_name」] => string(11)「Los Angeles」 [「short_name」] => string(11) [ 「類型」] =>陣列(2){[0] =>串(8) 「局部性」 [1] =>串(9) 「政治」} ... <

我'喜歡通過搜索/解析/?在變量$ locality中存儲值「洛杉磯」?條件「type = locality」的數組。

我不想使用代碼中找到的信息:

回聲$ phpresult [ '結果'] [0] [ 'address_components'] [3] [ 'LONG_NAME'];

因爲該假設變量總是1)在數組中的相同位置和2)它存在。

任何幫助將非常感激。我還沒有找到答案,可能已經閱讀(但不完全理解)每個帖子的相關主題。

在此先感謝您的幫助。

肖恩

+0

我認爲陣列格式保持原樣如此以上應該很好。只是一個想法 - 也許你需要檢索信息作爲XML和使用xpath。或者,如果你想堅持以上,也許你需要創建一個函數,循環這個數據數組,並檢查關鍵的'地方'等 – TigerTiger 2012-08-03 07:24:29

回答

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 array 獲取該位置的long_name並將其存儲。

編輯:該函數將存儲具有局部類型的位置的所有long_names,不僅僅是第一個。 爲了僅獲取第一個位置的long_name,請在$locality[] = ...之後添加「break」。

+0

太好了。如果我想將其他變量添加到數組中,代碼是:$ locality [] = $ location [types] [0]; AND $ locality [] = $ location ['short_name'];? – 2012-08-03 08:57:37

+0

你應該這樣做: '$ locality [] = array( 'type'=> $ location ['types'] [0], 'short_name'=> $ location ['short_name'] ); ' 這樣,數組中的每個鍵都是一個位置。 像這樣訪問它:'$ locality [X] ['type']'和'$ locality [X] ['short_name']'。當x是密鑰號碼(從0到...) – 2012-08-03 09:01:01

1

你可以做的preg_match使用此模式:

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

Demo

這會在索引1,並在很短的名字與3個elemnts與長名稱返回數組索引2

或使用循環:

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

如果要爲您硬編碼,可以添加另一個循環來檢查所有結果。

+0

這太棒了。謝謝。我實際上創建了一個foreach循環,並在我發佈之後找出它,但我的代碼似乎是服務器密集型的。我有3個foreach循環(嵌套:我認爲這是正確的術語)和一個if語句。你認爲哪種方式效率最高,服務器密集度更低?另外,其中一個或另一個被認爲是最佳實踐?我在這個評論中引用了你的兩個選項以及我的。 – 2012-08-03 08:47:38

+0

這取決於返回數組的大小。正則表達式很慢,但解析一個LARGE json回答也需要時間。我真的不知道你的情況會更好,但我會用正則表達式。 – 2012-08-03 08:59:56