递归PHP函数写入外部数组

Posted

技术标签:

【中文标题】递归PHP函数写入外部数组【英文标题】:Recursive PHP function writing to external array 【发布时间】:2011-07-14 00:45:42 【问题描述】:

这里真的有两个问题;为什么会这样?以及可以做些什么呢?

抱歉问题太长了,但大部分只是print_r 输出!

基本上,我从一个扁平的标签数组 ($tags) 开始,每个标签都有一个 id(数组索引)、nameparent_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函数写入外部数组的主要内容,如果未能解决你的问题,请参考以下文章

php递归函数返回数组

如何将递归函数的答案放入数组(PHP)中?

PHP递归函数将多维数组转换为xml

将嵌套数组转换为嵌套 html 块的递归 php 函数

如何用php创建一个无限遍历数组,并打印

使用递归函数获取多维php数组的新值和键