2015-06-14 124 views
1

我正在爲我的SimpleXMLElement Object中的數組奮鬥。不知何故,當我打印陣列$node->reference時,我沒有得到預期的結果。打印數組時出現SimpleXMLElement對象時出現奇怪的行爲

print_r($node);顯示:

SimpleXMLElement Object 
(
    [reference] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [resourceIdentifier] => 52chgb7f-1a00-4eaf-ac8a-5d4557f9796a 
         ) 

       ) 

      [1] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [resourceIdentifier] => 52cbccc3-b754-4e88-9238-5d5257f9796a 
         ) 

       ) 

     ) 
) 

print_r($node->reference);print_r($node->reference->children());顯示:

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [resourceIdentifier] => 52chgb7f-1a00-4eaf-ac8a-5d4557f9796a 
     ) 

) 

我希望看到:

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [resourceIdentifier] => 52chgb7f-1a00-4eaf-ac8a-5d4557f9796a 
       ) 

     ) 

    [1] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [resourceIdentifier] => 52cbccc3-b754-4e88-9238-5d5257f9796a 
       ) 

     ) 

) 

編輯

下面是一些代碼來重現:

<?php 

$xml = '<?xml version="1.0" encoding="UTF-8" ?> 
<items> 
    <item> 
     <reference resourceIdentifier="52chgb7f-1a00-4eaf-ac8a-5d4557f9796a" /> 
     <reference resourceIdentifier="52cbccc3-b754-4e88-9238-5d5257f9796a" /> 
    </item> 
    <item> 
     <reference resourceIdentifier="52chgb7f-1a00-4eaf-ac8a-5d4557f9796a" /> 
    </item> 
    <item> 
     <reference resourceIdentifier="52chgb7f-1a00-4eaf-ac8a-5d4557f9796a" /> 
     <reference resourceIdentifier="52chgb7f-1a00-4eaf-ac8a-5d4557f9796a" /> 
     <reference resourceIdentifier="52cbccc3-b754-4e88-9238-5d5257f9796a" /> 
    </item> 
</items>'; 

$items = new \SimpleXMLElement($xml); 
foreach ($items as $item) { 

    echo '<h1>Item</h1>'; 
    echo '<pre>'; 
    print_r($item); 
    print_r($item->reference); // Returns always 1 SimpleXMLElement Object? 
    print_r($item->reference->children()); // Returns always 1 SimpleXMLElement Object? 
    echo '</pre>'; 

} 
+0

嘗試'的print_r($節點 - >參考 - > children());' – VolenD

+0

@ user3584460不幸的是我得到了與'print_r($ node-> reference)相同的結果;' –

+0

我添加了一些代碼來重現。 –

回答

3

簡單的答案是:不靠print_r。 SimpleXML的一點是,它使用了很多,因爲需要更好的單詞「magic」,並且print_r(和var_dump,var_export以及幾乎任何其他通用調試或序列化函數)都不會告訴你它將如何表現。另外,這非常重要,SimpleXMLElement不包含任何數組

我寫了a dedicated debug function雖然不完美,但它通過SimpleXML對象進行遞歸比本地遞歸更好。

這樣做的原因具體行爲,您可以使用$node->reference要麼全稱爲reference第一個這樣的孩子的孩子的名單。以下全部是等效的:

// Access as iterable list 
foreach ($node->reference as $ref) { 
    echo $ref['resourceIdentifier']; 
    // only loop once 
    break; 
} 

// Access as numerically indexed array 
echo $node->reference[0]['resourceIdentifier']; 

// Access first item by default 
echo $node->reference['resourceIdentifier']; 

當您有一個「深但窄」的文檔時,這非常方便,例如,

$xml = simplexml_load_string('<foo><bar><baz><quux hello="world" /></baz></bar></foo>'); 
echo $xml->bar->baz->quux['hello']; // world 

而不是你不必檢查節點是否是唯一或多個,SimpleXML的只是讓你寫出這樣的表達,忽略任何倍數:

$xml = simplexml_load_string('<foo><bar><baz><quux hello="world" /><quux ignored="true" /></baz></bar><bar>ignored</bar></foo>'); 
echo $xml->bar->baz->quux['hello']; // world 
相關問題