无法在递归函数中将元素添加到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
应该可以解决您的问题。