2012-07-11 13 views
19

के गुण देखते SimpleXML एक सरणी के लिए जिम्मेदार बताते हैं से बचने के लिए किसी भी अधिक सुंदर तरीका है?SimpleXML सरणी

$result = $xml->xpath($xpath); 
$element = $result[ 0 ]; 
$attributes = (array) $element->attributes(); 
$attributes = $attributes[ '@attributes' ]; 

मैं वास्तव में कुंजी/मूल्य जोड़ी निकालने के लिए इसे लूप करना नहीं चाहता हूं। मुझे बस एक सरणी में लाने की जरूरत है और फिर इसे पास करना है। मैंने सोचा होगा कि attributes() डिफ़ॉल्ट रूप से इसे किया होगा, या कम से कम विकल्प दिया होगा। लेकिन मुझे उपरोक्त समाधान को कहीं भी नहीं मिला, मुझे इसे खुद ही समझना पड़ा। क्या मैं इस या कुछ को जटिल बना रहा हूं?

संपादित करें:

मैं अभी भी ऊपर स्क्रिप्ट का उपयोग कर रहा जब तक मैं यकीन नहीं है कि @attributes सरणी तक पहुँचने सुरक्षित है या नहीं के लिए पता है।

उत्तर

11

सीधे '@attributes' संपत्ति न पढ़ें, कि आंतरिक उपयोग के लिए है। वैसे भी, attributes() को वास्तविक सरणी में "रूपांतरित" करने की आवश्यकता के बिना पहले से ही एक सरणी के रूप में उपयोग किया जा सकता है।

उदाहरण के लिए:

<?php 
$xml = '<xml><test><a a="b" r="x" q="v" /></test><b/></xml>'; 
$x = new SimpleXMLElement($xml); 

$attr = $x->test[0]->a[0]->attributes(); 
echo $attr['a']; // "b" 

आप इसे एक "सही" सरणी होना चाहते हैं, तो आप पाश करने के लिए है करने वाले हैं:

$attrArray = array(); 
$attr = $x->test[0]->a[0]->attributes(); 

foreach($attr as $key=>$val){ 
    $attrArray[(string)$key] = (string)$val; 
} 
+0

हाँ, पर इस के साथ समस्या यह है कि यह अभी भी एक SimpleXML तत्व के रूप में खुद के बारे में सोचती है और इसलिए आप एक स्ट्रिंग के लिए टाइपकास्ट करने के लिए '$ attr [ 'एक']' यह ठीक से काम करने के लिए होता है। मैं इस सरणी को किसी अन्य वर्ग में भेज रहा हूं जो यह नहीं जानता कि यह किस प्रकार का होना चाहिए, केवल इतना है कि इसे एक सरणी होना चाहिए। – mseancole

+0

आह, आपको इसे संपादन में मिला है ... क्या मैं वर्तमान में जो कर रहा हूं उससे लूप "बेहतर" है? मुझे लगता है कि लूप के बिना ऐसा करना तेज होगा। – mseancole

+0

@Showerhead: मुझे नहीं पता कि यह बेहतर है, लेकिन मैंने हमेशा सीखा है कि '' गुण 'संपत्ति को सीधे नहीं पढ़ना है। –

0

मुझे लगता है कि आप के माध्यम से लूप करना होगा। एक बार जब आप xml पढ़ते हैं तो आप इसे सरणी में प्राप्त कर सकते हैं।

<?php 
function objectsIntoArray($arrObjData, $arrSkipIndices = array()) 
{ 
$arrData = array(); 

// if input is object, convert into array 
if (is_object($arrObjData)) { 
    $arrObjData = get_object_vars($arrObjData); 
} 

if (is_array($arrObjData)) { 
    foreach ($arrObjData as $index => $value) { 
     if (is_object($value) || is_array($value)) { 
      $value = objectsIntoArray($value, $arrSkipIndices); // recursive call 
     } 
     if (in_array($index, $arrSkipIndices)) { 
      continue; 
     } 
     $arrData[$index] = $value; 
    } 
} 
return $arrData; 
} 

$xmlStr = file_get_contents($xml_file); 
$xmlObj = simplexml_load_string($xmlStr); 
$arrXml = objectsIntoArray($xmlObj); 

foreach($arrXml as $attr) 
    foreach($attr as $key->$val){ 
if($key == '@attributes') .... 
} 
+1

'ऑब्जेक्टइंटरएरे' क्या है? साथ ही, आपको सीधे '' गुण '' नहीं पढ़ना चाहिए, यही है '-> विशेषताएँ() 'के लिए है। –

+0

क्षमा करें, मैंने अपने कोड से चिपकाया शीर्ष भाग सिर्फ इसे संपादित किया है। – PoX

40

एक और अधिक सुरुचिपूर्ण तरीका; एक सरणी में

$attributes = current($element->attributes()); 
+0

बिल्कुल सरल, कॉम्पैक्ट और कम संचालन। –

+0

@ सिल्वरस्केटर: बहुत उपयोगी, यह मेरे लिए काम करता है! बहुत बहुत धन्यवाद –

+0

यह जवाब होना चाहिए – kfriend

1

आप पूरी XML दस्तावेज़ में परिवर्तित कर सकते: यह आप $ विशेषताओं [ '@attributes'] का उपयोग किए बिना एक ही परिणाम देता है

$array = json_decode(json_encode((array) simplexml_load_string("<response>{$xml}</response>")), true); 

अधिक जानकारी के लिए देखें: https://github.com/gaarf/XML-string-to-PHP-array

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