递归PHP函数写入外部数组
Posted
技术标签:
【中文标题】递归PHP函数写入外部数组【英文标题】:Recursive PHP function writing to external array 【发布时间】:2011-07-14 00:45:42 【问题描述】:这里真的有两个问题;为什么会这样?以及可以做些什么呢?
抱歉问题太长了,但大部分只是print_r
输出!
基本上,我从一个扁平的标签数组 ($tags
) 开始,每个标签都有一个 id
(数组索引)、name
和 parent_id
。然后我递归地遍历$tags
并将所有子标签嵌套在它们的父标签中。 (见下文)
有效! (见下文输出)。但是我遇到的问题是我的平面标签数组是从执行嵌套/递归的函数中写入的。 (见下文)
标签的扁平数组:
Array
(
[1] => stdClass Object
(
[name] => instruments
[parent_id] => 0
)
[2] => stdClass Object
(
[name] => strings
[parent_id] => 1
)
[3] => stdClass Object
(
[name] => violin
[parent_id] => 2
)
[4] => stdClass Object
(
[name] => cello
[parent_id] => 2
)
[5] => stdClass Object
(
[name] => woodwind
[parent_id] => 1
)
[6] => stdClass Object
(
[name] => flute
[parent_id] => 5
)
)
这是嵌套子标签的递归调用函数。问题出在if
内部:我将$tag
分配给$tree[$i]
,然后将children
属性添加到它。这导致children
属性被添加到$tag
。这就是我想要停止发生的事情。
public function tags_to_tree($tags, $parent_id = 0)
$tree = array();
foreach($tags as $i => $tag)
// add this tag node and all children (depth-first recursive)
if(intval($parent_id) === intval($tag->parent_id))
$tree[$i] = $tag;
$tree[$i]->children = $this->tags_to_tree($tags, $i);
return $tree;
嵌套标签输出:
Array
(
[1] => stdClass Object
(
[name] => instruments
[parent_id] => 0
[children] => Array
(
[2] => stdClass Object
(
[name] => strings
[parent_id] => 1
[children] => Array
(
[3] => stdClass Object
(
[name] => violin
[parent_id] => 2
)
[4] => stdClass Object
(
[name] => cello
[parent_id] => 2
)
)
)
[5] => stdClass Object
(
[name] => woodwind
[parent_id] => 1
[children] => Array
(
[6] => stdClass Object
(
[name] => flute
[parent_id] => 5
)
)
)
)
)
)
将children
属性添加到$tree[$i]
或将$tag
分配给$tree[$i]
以阻止这种情况发生时,我可以做些什么不同的事情?
谢谢!
【问题讨论】:
【参考方案1】:平面数组是一个对象数组(引用),即使您将对象放入一个新数组中,它仍然是您正在移动的同一个对象。
如果您不想编辑相同的参考,请查看Object Cloning
即使用:
$tree[$i] = clone $tag;
【讨论】:
太棒了!这么长的问题,这么简单的答案,非常感谢。测试和工作:)以上是关于递归PHP函数写入外部数组的主要内容,如果未能解决你的问题,请参考以下文章