2009-05-07 15 views
17

से रिकर्सिव कास्ट मुझे एक सरणी में एक PHP SimpleXMLObject को दोबारा डालने की आवश्यकता है। समस्या यह है कि प्रत्येक उप तत्व भी एक PHP SimpleXMLElement है।सरल xMLObject से ऐरे

क्या यह संभव है?

उत्तर

52
json_decode(json_encode((array) simplexml_load_string($obj)), 1); 
+0

चालाक! मैंने ऐसा कभी नहीं सोचा होगा। –

+3

यदि संभव हो तो मैं आपको 100 अपवॉट्स देता। यह सिर्फ कमाल है :) –

+0

चालाक अभी तक पठनीय, रखरखाव और सुरुचिपूर्ण। – Eddified

6

यह एक परीक्षण नहीं किया, लेकिन यह कार्य पूर्ण करने में लगता है:

function convertXmlObjToArr($obj, &$arr) 
{ 
    $children = $obj->children(); 
    foreach ($children as $elementName => $node) 
    { 
     $nextIdx = count($arr); 
     $arr[$nextIdx] = array(); 
     $arr[$nextIdx]['@name'] = strtolower((string)$elementName); 
     $arr[$nextIdx]['@attributes'] = array(); 
     $attributes = $node->attributes(); 
     foreach ($attributes as $attributeName => $attributeValue) 
     { 
      $attribName = strtolower(trim((string)$attributeName)); 
      $attribVal = trim((string)$attributeValue); 
      $arr[$nextIdx]['@attributes'][$attribName] = $attribVal; 
     } 
     $text = (string)$node; 
     $text = trim($text); 
     if (strlen($text) > 0) 
     { 
      $arr[$nextIdx]['@text'] = $text; 
     } 
     $arr[$nextIdx]['@children'] = array(); 
     convertXmlObjToArr($node, $arr[$nextIdx]['@children']); 
    } 
    return; 
} 

से http://www.codingforums.com/showthread.php?t=87283

+0

यह मेरे लिए काम नहीं करता –

+1

यह सुनिश्चित नहीं है कि यह दूसरों के लिए "काम नहीं करता", लेकिन यह सभी बच्चों और विशेषताओं के माध्यम से पुन: प्रयास करने का काम करता है। –

+0

यह सीडीएटीए – reggie

0

लिया यह संभव है। यह एक पुनरावर्ती कार्य है जो मूल तत्वों के टैग और टैग + उन तत्वों की सामग्री को प्रिंट करता है जिनमें अब और बच्चे नहीं हैं। आप एक सरणी का निर्माण करने के लिए इसे बदल सकते हैं:

foreach($simpleXmlObject as $element) 
{ 
    recurse($element); 
} 

function recurse($parent) 
{ 
    echo '<' . $parent->getName() . '>' . "\n";  

    foreach($parent->children() as $child) 
    { 
     if(count($child->children()) > 0) 
     { 
      recurse($child); 
     } 
     else 
     { 
      echo'<' . $child->getName() . '>'; 
      echo iconv('UTF-8', 'ISO-8859-1', $child); 
      echo '</' . $child->getName() . '>' . "\n"; 
     } 
    } 

    echo'</' . $parent->getName() . '>' . "\n"; 
} 
0

मैं बिंदु नहीं दिख रहा है के बाद से SimpleXMLObject बस सरणियों वैसे भी तरह threated जा सकता है ...

यदि आपको वास्तव में है कि जरूरत है, बस chassagnette के जवाब की जांच एक मंच में this thread या this post में से।

+2

पढ़ता नहीं है जब आप इसे किसी सत्र में संग्रहीत करना चाहते हैं, 'सिंपलएक्सएमलेमेंट' का 'सीरियलाइजेशन' प्राप्त करना 'जब मैं कोशिश करता हूं तो अनुमति नहीं देता है। इसलिए सरणी को कास्टिंग उपयोगी है –

+0

@GromBeestje: एक्सएमएल पहले से ही क्रमबद्ध है। सत्र में स्ट्रिंग को स्टोर करने में कोई समस्या नहीं है :) – hakre

+0

स्क्रिप्ट लोड अक्षम होने पर हर बार XML स्ट्रिंग को पार्स करना, इसलिए मुझे लगता है कि यह एक पार्स किए गए फॉर्म को स्टोर करने के लिए समझ में आता है। –

संबंधित मुद्दे