2011-08-12 35 views
5

Tôi đang tạo lớp mã hóa địa lý có thể sử dụng nhiều dịch vụ web cho mã hóa địa lý (ví dụ: Google, Yahoo, Bing, v.v.). Tôi đang cố gắng làm cho nó theo cách mà các dịch vụ web mới có thể được cấu hình dễ dàng. Hầu hết các dịch vụ web trả về XML/JSON .. cho PHP tôi đã chọn XML làm trọng tâm chính của tôi. Tất cả các mã đã được tại chỗ, nhưng bây giờ Google ví dụ trả về XML sau (chuyển thành một simple_xml_element)Tự động truy cập đối tượng lồng nhau

SimpleXMLElement Object 
(
[status] => OK 
[result] => Array 
    (
     [0] => SimpleXMLElement Object 
      (
       [type] => postal_code 
       [formatted_address] => 1010 Lausanne, Switzerland 
       [address_component] => Array 
        (
         [0] => SimpleXMLElement Object 
          (
           [long_name] => 1010 
           [short_name] => 1010 
           [type] => postal_code 
          ) 

         [1] => SimpleXMLElement Object 
          (
           [long_name] => Lausanne 
           [short_name] => Lausanne 
           [type] => Array 
            (
             [0] => locality 
             [1] => political 
            ) 

          ) 

         [2] => SimpleXMLElement Object 
          (
           [long_name] => Vaud 
           [short_name] => VD 
           [type] => Array 
            (
             [0] => administrative_area_level_1 
             [1] => political 
            ) 

          ) 

         [3] => SimpleXMLElement Object 
          (
           [long_name] => Switzerland 
           [short_name] => CH 
           [type] => Array 
            (
             [0] => country 
             [1] => political 
            ) 

          ) 

        ) 

       [geometry] => SimpleXMLElement Object 
        (
         [location] => SimpleXMLElement Object 
          (
           [lat] => 46.5376186 
           [lng] => 6.6539665 
          ) 

         [location_type] => APPROXIMATE 
         [viewport] => SimpleXMLElement Object 
          (
           [southwest] => SimpleXMLElement Object 
            (
             [lat] => 46.5253574 
             [lng] => 6.6384420 
            ) 

           [northeast] => SimpleXMLElement Object 
            (
             [lat] => 46.5467887 
             [lng] => 6.6745222 
            ) 

          ) 

         [bounds] => SimpleXMLElement Object 
          (
           [southwest] => SimpleXMLElement Object 
            (
             [lat] => 46.5253574 
             [lng] => 6.6384420 
            ) 

           [northeast] => SimpleXMLElement Object 
            (
             [lat] => 46.5467887 
             [lng] => 6.6745222 
            ) 

          ) 

        ) 

      ) 
) 

Thông tin mà tôi cần là trong [vị trí] thẻ, vì vậy tôi đã cố gắng lưu trữ các con đường trong một var:

$lat_path = 'result[0]->geometry->location->lat; 

Và sau đó cố gắng truy cập vào các giá trị theo cách này:

(suppose $xml is the object) 
$xml->{$lat_path}; 

Nhưng điều này doens't làm việc. Có cách nào tôi có thể truy cập thông tin động hoặc biến dựa trên. Tôi không muốn hủy hoại phương pháp mã hóa địa lý của mình bằng mã cụ thể của Google.

Cảm ơn!

+0

Sử dụng [SimpleXMLElement :: xpath] (http://www.php.net/manual/simplexmlelement.xpath.php) thay vì ký hiệu phản đối php. (nếu bạn có thể hiển thị một số xml, tôi sẽ cố gắng cung cấp ví dụ) – Yoshi

+0

Bạn có thể viết phương thức đó và quên .. – Vytautas

+0

Tôi đã thử sử dụng Xpath, nhưng nó không hoạt động: ( print_r ($ xml-> Xpath ('geometry/location')); cho tôi một mảng trống. –

Trả lời

2

Khi bạn làm

$xml->{$lat_path}; 

PHP sẽ sử dụng bất cứ thứ gì trong vòng $lat_path như tên biến. Nó sẽ không phải chuyển vào biểu đồ đối tượng hoặc tuân theo T_OBJECT_OPERATOR. Nó chỉ đơn giản là tìm kiếm một tài sản

'result[0]->geometry->location->lat;' 

trong $xml. Cố gắng chạy mã này cho một ví dụ:

$obj = new StdClass; 
$obj->{'result[0]->geometry->location->lat;'} = 1; 
print_r($obj); 

Nó sẽ ra

stdClass Object 
(
    [result[0]->geometry->location->lat;] => 1 
) 

Như bạn thấy, nó là một tài sản duy nhất, không phải là một đối tượng đồ thị dưới lồng nhau.

Giống như gợi ý trong các ý kiến, hoặc là sử dụng XPath hoặc đi đến giá trị mong muốn trực tiếp:

$xml->result[0]->geometry->location->lat; 
1

Nếu bạn không thể sử dụng xPath và cần phải truy cập vào một đối tượng động, bạn có thể sử dụng sau cách tiếp cận:

$oObj = new StdClass; 
$oObj->Root->Parent->ID = 1; 
$oObj->Root->Parent->Child->ID = 2; 

$sSeachInTree = 'Root\\Parent\\Child\\ID'; 
$aElements = explode("\\",$sSeachInTree); 

foreach($aElements as $sElement) 
{ 
    if (isset($oObj->{$sElement})) 
    { 
     if (end($aElements) == $sElement)  
     { 
      echo "Found: " . $sElement . " = " . $oObj->{$sElement}; 
     } 
     $oObj = $oObj->{$sElement}; 
    } 
} 
Các vấn đề liên quan