2011-08-05 9 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'; 필요)

B 내가 반환 (구글)의 함량을 줄일 수 있습니다 내가 모든 것을 필요로하지 않는 한 어떻게 든 파일?

업데이트

내가 JSON 객체에 데이터의 일부를 추가해야합니다. 따라서 디코딩 & 인코딩은 에너지 손실 (이 시점에서) & 시간처럼 보입니다. 어떤 아이디어라도 XML 객체를 요청할 때 (더 빨리) 더 좋을까요? (. 객체의 최종 세트는 정말 성능에 대해 관심을 가져야하는 이유는 꽤 크다.)


Google지도지도 서버 (파일 내용)에서

예 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는 실제로 googles API에 관한 것이므로 별도의 질문이거나 googlemaps가되도록 제목을 변경해야합니다. –

답변

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

var_dump($countries); 

'country' 유형의 모든 address_components을 제공합니다. 아마 그것만이 될 것이지만, 일 수 있습니다. 이 구문을 사용하려면 PHP 5.3 이상이 필요합니다.

모든 것이 필요하지 않으므로 반환 된 (Google) 파일의 내용을 어떻게 든 줄일 수 있습니까?

복호화 된 부분을 취하면 나머지는 잊어 버릴 수 있습니다. $array 원하는 경우 json_encode을 다시 입력하십시오.

+0

v5.3 + (서버에서 사용할 수 있는지 확실하지 않음)를 제외하고는 똑바로 +1하십시오. 슬프게도 내가 찾던 것이 _ 아닙니다. 업데이트 된 답변을 참조하십시오. – kaiser

+0

@kaiser PHP 5.2의 경우 'create_function'을 사용하여 공식화 할 수 있습니다. 업데이트 된 질문은 다음과 같습니다. 컴팩트하고 ** 효율적인 ** 솔루션을 찾지 못할 것입니다. JSON 같은 작은 스 니펫을 디코딩하고 인코딩하는 것은 큰 문제가 아닙니다. 어떤 종류의 수동 문자열 파싱 및 조작을 시도하는 것은 훨씬 더 많은 노력과 많은 오류가 발생하기 쉽습니다. XML은 대략적으로 동일한 오버 헤드를 가질 것이다. 왜냐하면 당신도 해석해야하기 때문이다. 스트림을 조금씩 읽고 필요한 부분을 그대로 복사하면 * 좀 더 효율적일 수있다. – deceze

+0

콜백 함수가 있으면 익명 또는 람다 함수가 필요하지 않습니다. 확실하지는 않지만, 익명/람다 대신 콜백 함수로 직접 in_array()를 호출 할 수있는 기회가있을 수 있습니다. XML에 관해서는 두 가지 방법으로 테스트 할 것입니다. 너무 많은 항목이 있고 슬프게도 신경 써야합니다. 감사! – kaiser