Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在递归函数中将元素添加到PHP数组_Php_Xml_Arrays_Recursion - Fatal编程技术网

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

无法在递归函数中将元素添加到PHP数组,php,xml,arrays,recursion,Php,Xml,Arrays,Recursion,我有一个名为library.XML的XML文档,我使用PHP函数simplexml\u load\u file()获取一个可以使用的XML对象。我有一个名为traverseObject()的函数,它遍历文档并根据文档打印出一个嵌套列表 在这个嵌套列表中打印出来的标记之一是id标记。我试图将所有id标记收集到一个名为$id的数组变量中,以便使用它们生成页面的另一部分。问题是,当我尝试将这些ids添加到数组中时,它是空的。我试着将数字5反复添加到数组中,但仍然不起作用 以下是简化(用于调试)程序的外

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

在这个嵌套列表中打印出来的标记之一是
id
标记。我试图将所有
id
标记收集到一个名为
$id
的数组变量中,以便使用它们生成页面的另一部分。问题是,当我尝试将这些
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>

测验
它应该只在数组
$ids
中添加一堆
5
,然后将它们打印出来,但是正如您所看到的,数组“$ids$为空。下面是打印的内容:

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

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

function traverseObject($object, &$map) 
                                 ^
您需要在函数声明中使用;否则,
$map
将被视为函数局部变量

function traverseObject($object, &$map) 
                                 ^

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

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

foreach ($map as $key => $value) {
    // ...
}
将实际创建该值的新副本,该副本与您在顶部操作的副本不同。因此,需要将该值作为引用传递

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

foreach ($map as $key => &$value) {
    // ...
}
在函数参数的情况下,一个简单的解决方案可能是操作对象而不是数组,因为对象总是通过引用而不是复制来传输


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

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

foreach ($map as $key => $value) {
    // ...
}
将实际创建该值的新副本,该副本与您在顶部操作的副本不同。因此,需要将该值作为引用传递

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

foreach ($map as $key => &$value) {
    // ...
}
在函数参数的情况下,一个简单的解决方案可能是操作对象而不是数组,因为对象总是通过引用而不是复制来传输


哇,直到现在我才知道我对PHP的了解有多少。谢谢,杰克。哇,直到现在我才知道我对PHP的了解有多少。谢谢,Jack。从文档中可以看出,您似乎只需要在函数声明中使用引用运算符。引用“不应通过引用传递其他表达式,因为结果是未定义的。例如,以下通过引用传递的示例是无效的:“我们讨论的是同一件事吗?我应该补充一点,我的代码当前有效(或至少似乎有效),而
foreach
循环就是这样。你是说
$key=>$value$
等同于
$key,&$value$
?对于
$key,&$value
,这只是一个错误(我刚刚更正了代码片段)。我只是做了太多的JavaScript!;)在任何情况下,foreach循环的示例都与您的情况无关,因为您没有试图更改$value的值。无论如何,在方法参数中使用
&$map
而不是
$map
应该可以解决您的问题。从文档中可以看出,您似乎只需要在函数声明中使用引用运算符。引用“不应通过引用传递其他表达式,因为结果是未定义的。例如,以下通过引用传递的示例是无效的:“我们讨论的是同一件事吗?我应该补充一点,我的代码当前有效(或至少似乎有效),而
foreach
循环就是这样。你是说
$key=>$value$
等同于
$key,&$value$
?对于
$key,&$value
,这只是一个错误(我刚刚更正了代码片段)。我只是做了太多的JavaScript!;)在任何情况下,foreach循环的示例都与您的情况无关,因为您没有试图更改$value的值。无论如何,在方法参数中使用
&$map
而不是
$map
应该可以解决您的问题。