Динамический доступ к вложенному объекту - PullRequest
5 голосов
/ 12 августа 2011

Я создаю класс геокодирования, который может использовать несколько веб-сервисов для геокодирования (например, Google, Yahoo, Bing и т. Д.). Я пытаюсь сделать так, чтобы новые веб-сервисы можно было легко настроить. Большинство веб-сервисов возвращают либо XML / JSON ... для PHP, я выбрал XML в качестве основного направления. Весь код уже на месте, но теперь Google, например, возвращает следующий XML (преобразованный в простой_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], поэтому я попытался сохранить путь в переменной:

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

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

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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

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

$xml->{$lat_path};

PHP будет использовать что-либо в пределах $lat_path в качестве имени переменной. не войдет в граф объектов или будет подчиняться 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;
1 голос
/ 18 октября 2013

Если вы не можете использовать 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};
    }
}
...