Динамический доступ к вложенному объекту

Я создаю класс геокодирования, который может использовать несколько веб-сервисов для геокодирования (например, Google, Yahoo, Bing и т. Д.). Я пытаюсь сделать это так, чтобы новые веб-сервисы можно было легко настроить. Большинство веб-сервисов возвращают либо XML / JSON .. для PHP. Я выбрал XML в качестве своего основного внимания. Весь код уже на месте, но теперь Google, например, возвращает следующий XML (преобразованный в simple_xml_element)

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 ) ) ) ) ) 

Информация, которая мне нужна, находится в теге [location], поэтому я попытался сохранить путь в var:

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

И затем попытайтесь получить доступ к значению таким образом:

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

Но это не работает. Есть ли способ получить доступ к информации динамически или на основе переменных. Я не хочу разрушать свой метод геокодирования кодом Google.

Благодаря!

Related of "Динамический доступ к вложенному объекту"

Когда вы это сделаете

 $xml->{$lat_path}; 

PHP будет использовать что-либо в $lat_path как имя переменной. Он не войдет в граф объектов или T_OBJECT_OPERATOR не подчиняется T_OBJECT_OPERATOR . Он просто ищет свойство

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

в $xml . Попробуйте запустить этот код для примера:

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

Он будет выводить

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

Как вы можете видеть, это одно единственное свойство, а не граф вложенных объектов.

Как и в комментариях, используйте XPath или перейдите к нужному значению напрямую:

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

Если вы не можете использовать xPath и вам нужно динамически обращаться к объекту, вы можете использовать следующий подход:

 $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}; } }