无法在递归函数中向PHP数组添加元素

时间:2014-04-21 01:55:58

标签: php xml arrays recursion

我有一个名为library.xml的XML文档,我使用PHP函数simplexml_load_file()来获取我可以使用的XML对象。我有一个名为traverseObject()的函数,它遍历文档并根据文档打印出一个嵌套列表。

在此嵌套列表中打印出的其中一个标记是id标记。我正在尝试将所有id标记收集到一个名为$ids的数组变量中,以便我可以使用它们生成页面的另一部分。问题是,当我尝试将这些id添加到数组时,它是空的。我试过重复将数字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 $为null。这是打印的内容:

enter image description here

我现在已经多次查看了代码,但我看不出它有什么问题。

2 个答案:

答案 0 :(得分:3)

您需要在函数声明中使用references;否则$map将被视为函数局部变量。

function traverseObject($object, &$map) 
                                 ^

答案 1 :(得分:1)

正如@Jack所说,你的问题是你没有通过引用传递数组。但原因不正确。 与对象不同,PHP实际上通过在函数或循环中传递变量时复制变量来传输标量变量(数组,字符串,整数,浮点数等)。这意味着以下两个代码段都不会修改该值。

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

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

实际上会创建一个值的新副本,这与您在顶部操作的值不同。因此,您需要将值作为参考传递。

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

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

对于函数参数,一个简单的解决方案可能是操作对象而不是数组,因为对象总是通过引用传输,而不是通过复制传递。

请参阅Official documentation