我有一个名为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。这是打印的内容:
我现在已经多次查看了代码,但我看不出它有什么问题。
答案 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) {
// ...
}
对于函数参数,一个简单的解决方案可能是操作对象而不是数组,因为对象总是通过引用传输,而不是通过复制传递。