2014-04-21 57 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'应该可以解决您的问题。 –