2011-08-05 68 views
0

我在玩Google地圖和地理編碼(將地址轉換爲lang/lat座標)。一切正常,迄今爲止,我得到一個從谷歌地圖服務器與文件的答案:獲取JSON對象的一部分

$address = urlencode($address); 
$url = "http://maps.google.com/maps/api/geocode/json?address={$address}&sensor=false"; 
$content = file_get_contents($url); 
echo '<pre>'; 
    print_r($content); 
echo '</pre>'; 

點是,我不需要所有的信息。

問題

一個我怎麼只得到了JSON對象的一部分? (:我只需要'results'->'address_components'->'type' = 'country';

我可減少返回(谷歌)的內容文件不知何故,因爲我並不需要的一切嗎?

更新

我需要添加數據的一部分,以JSON對象。因此,解碼&然後編碼看起來像一個能量損失(在這一點上)。任何想法,如果我會更好(更快)請求一個XML對象? (最後一組對象是相當大的這就是爲什麼我應該真正關心的性能。)


從谷歌地圖的地圖服務器(文件內容)

例JSON答案:

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "28", 
       "short_name" : "28", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Sellhorner Weg", 
       "short_name" : "Sellhorner Weg", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Behringen", 
       "short_name" : "Behringen", 
       "types" : [ "sublocality", "political" ] 
      }, 
      { 
       "long_name" : "Bispingen", 
       "short_name" : "Bispingen", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "Soltau-Fallingbostel", 
       "short_name" : "Soltau-Fallingbostel", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "Niedersachsen", 
       "short_name" : "NDS", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "Deutschland", 
       "short_name" : "DE", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "29646", 
       "short_name" : "29646", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "Sellhorner Weg 28, 29646 Bispingen, Deutschland", 
     "geometry" : { 
      "location" : { 
       "lat" : 53.118080, 
       "lng" : 9.966859999999999 
      }, 
      "location_type" : "ROOFTOP", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 53.11942898029150, 
        "lng" : 9.96820898029150 
       }, 
       "southwest" : { 
        "lat" : 53.11673101970850, 
        "lng" : 9.965511019708496 
       } 
      } 
     }, 
     "partial_match" : true, 
     "types" : [ "street_address" ] 
     } 
    ], 
    "status" : "OK" 
} 
+0

訪問你想要的部分,然後用這個子數組寫出一個新文件? – mario

+0

B部分確實涉及到Google API,應該是一個單獨的問題,或者您應該將標題更改爲Google地圖專用。 –

回答

4
$array = json_decode($content, true); 
$countries = array_filter($array['results']['address_components'], function ($a) { 
    return in_array('country', $a['types']); 
}); 

var_dump($countries); 

爲您提供address_components,它們的型號是'country'。也許這只是一個,但它可能不止一個。此語法需要PHP 5.3以上版本。

我可以以某種方式減少返回的(google)文件的內容,因爲我不需要所有的東西?

只需要解碼$array你需要的部分,忘記其餘的。如果你想,json_encode它再次。

+0

除了v5.3 +(這不一定在服務器上可用),一個+1。可悲的是,這不是我正在尋找的東西。請參閱最新的答案。 – kaiser

+0

@kaiser對於PHP 5.2,您可以使用'create_function'來表達這一點。至於你更新的問題:你很難找到另一種解決方案,如緊湊和**高效**。解碼和編碼JSON這樣一小段代碼真的不是什麼大問題。試圖做任何形式的手動字符串解析和操作都要花費更多精力,而且更容易出錯。 XML將具有大致相同的開銷,因爲您也需要解析它,但是如果您一點一點地讀取流並按原樣複製所需的部分,* *可能會稍微高效一些。 – deceze

+0

具有回調函數可避免使用匿名函數或lambda函數。我不確定,但可能有可能直接調用'in_array()'作爲回調函數(而不是匿名/ lambda)。至於XML:我會用這兩種方式來測試 - 有太多的條目,可悲的是不得不在乎。謝謝! – kaiser