Я создаю класс геокодирования, который может использовать несколько веб-сервисов для геокодирования (например, 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.
Благодаря!
Когда вы это сделаете
$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}; } }