2011-08-12 15 views
5

मैं एक जियोकोडिंग क्लास का निर्माण कर रहा हूं जो जियोकोडिंग (यानी Google, याहू, बिंग इत्यादि) के लिए एकाधिक वेबसाइसेस का उपयोग कर सकता है। मैं इसे इस तरह से बनाने की कोशिश कर रहा हूं कि नए वेबसाइसेस आसानी से कॉन्फ़िगर किए जा सकें। अधिकांश वेब सर्विसेज या तो एक्सएमएल/JSON लौटाते हैं .. PHP के लिए मैंने एक्सएमएल को अपना प्राथमिक फोकस चुना है। सभी कोड के स्थान पर पहले से ही है, लेकिन अब उदाहरण के लिए गूगल निम्नलिखित एक्सएमएल (एक 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 
            ) 

          ) 

        ) 

      ) 
) 

जानकारी की आवश्यकता [स्थान] टैग में है देता है, तो मैं पथ भंडारण की कोशिश की है एक वर में:

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

और फिर मूल्य इस तरह से पहुँचने का प्रयास:

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

लेकिन इस काम doens't। क्या कोई तरीका है कि मैं गतिशील रूप से या चर आधारित जानकारी तक पहुंच सकता हूं। मैं Google विशिष्ट कोड के साथ अपनी जियोकोडिंग विधि को बर्बाद नहीं करना चाहता हूं।

धन्यवाद!

+0

उपयोग [SimpleXMLElement :: xpath] (http://www.php.net/manual/simplexmlelement.xpath.php) php आपत्ति अंकन के बजाय। (यदि आप कुछ एक्सएमएल दिखा सकते हैं, तो मैं एक उदाहरण कार्यान्वयन प्रदान करने की कोशिश करूंगा) – Yoshi

+0

आप इसके लिए विधि लिख सकते हैं और भूल सकते हैं .. – Vytautas

+0

मैंने एक्सपैथ का उपयोग करने का भी प्रयास किया, लेकिन यह काम नहीं किया :( print_r ($ xml-> एक्सपैथ ('ज्यामिति/स्थान')); मुझे एक खाली सरणी दी। –

उत्तर

2

जब आप ऐसा करेंगे

$xml->{$lat_path}; 

पीएचपी चर नाम के रूप में $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

आप 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}; 
    } 
} 
संबंधित मुद्दे