2014-04-21 94 views
1

我有一個名爲library.xml的XML文檔,我使用PHP函數simplexml_load_file()來獲取我可以使用的XML對象。我有一個名爲traverseObject()的函數,它遍歷文檔並根據文檔打印出一個嵌套列表。無法在遞歸函數中向PHP數組添加元素

其中一個在此嵌套列表中打印出來的標籤是id標籤。我試圖將所有id標籤收集到一個名爲$ids的數組變量中,以便我可以使用它們生成頁面的另一部分。問題是,當我嘗試將這些id s添加到數組時,它是空的。我試過只是將數字5重複添加到數組中,但它仍然不起作用。

這裏是簡化什麼(調試)的程序是這樣的:

<!doctype html> 
<html lang="en"> 
<head> 
<meta charset="utf-8" /> 
</head> 
<body> 
<div>Test</div> 

<?php 

$library = simplexml_load_file('095209376/library.xml'); 

$ids = array(); 

function traverseObject($object, $map) 
{ 
    echo "<ul>"; 
    foreach ($object as $key => $value){ 
     if($key == "title"){ 
      echo "<li><b>" . $object->title . "</b></li>";   
     } else if ($key == "topic"){ 
      // traverse child elements, if any 
      traverseObject($value, $map); 
     } else if($key == "id"){ 
      echo "<i>id: " . $value . "</i>"; 
      $map[] = 5;       ** <-------- this is the relevant part 
     } else { // skip the rest for now 
     } 
    } 
    echo "</ul>"; 
} 

traverseObject($library, $ids); 

if($ids == null){ 

    echo "uh oh"; 

} else { 

    echo "whaaa"; 
    foreach ($ids as $key => $value){ 

     echo "key: " . $key . ", value: " . $value; 

    } 

} 

?> 
</body> 

</html> 

它應該只是添加了一堆5年代到陣列$ids,然後打印出來,但你可以看到數組`$ ids $爲空。這裏是獲取打印:

enter image description here

我看過了代碼一堆次了,但我看不出什麼毛病。

回答

3

您需要在函數聲明中使用references;否則$map將被視爲一個函數局部變量。

function traverseObject($object, &$map) 
           ^
+0

哇,我不知道我怎麼PHP很少知道到現在爲止。謝謝,傑克。 –

1

正如@Jack所說,您的問題在於您沒有通過引用傳遞數組。但是原因是不正確的。 與對象不同,PHP通過在函數中或循環中傳遞一個變量時通過複製變量來實際傳輸標量變量(數組,字符串,整數,浮點數等)。這意味着以下兩個片段都不會修改該值。

function traverseObject($object, $map) { 
    // ... 
} 

foreach ($map as $key => $value) { 
    // ... 
} 

實際上會創建一個新值,與您在頂部操作的值不同。因此,您需要將該值作爲參考。

function traverseObject($object, &$map) { 
    // ... 
} 

foreach ($map as $key => &$value) { 
    // ... 
} 

在函數參數的情況下,一個簡單的解決方案可以是操作對象,而不是一個數組,因爲對象是通過引用被複制總是轉移,而不是。

Official documentation

+0

從文檔看來,您只需要在*函數聲明*中使用引用運算符。引用「沒有其他表達式應該通過引用傳遞,因爲結果是未定義的。例如,以下引用傳遞的例子是無效的:」我們在談論同一件事情嗎? –

+0

我應該補充說,我的代碼目前工作(或至少似乎工作),與'foreach'循環,因爲它是。你只是說'$ key => $ value $'等價於'$ key,&$ value $'? –

+1

對於'$ key,&$ value',這只是一個錯誤(我剛糾正了片段)。我只是做了太多的JavaScript! ;) 在任何情況下,foreach循環的例子與您的情況無關,因爲您並未嘗試更改$ value的值。 無論如何,在方法參數中使用'&$ map'而不是'$ map'應該可以解決您的問題。 –