从 PHP 中的平面数组构建一棵树 [英] Build a tree from a flat array in PHP

查看:20
本文介绍了从 PHP 中的平面数组构建一棵树的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我环顾了互联网,并没有完全找到我要找的东西.我有一个平面数组,每个元素都包含一个id"和一个parent_id".每个元素只有一个父元素,但可能有多个子元素.如果 parent_id = 0,则将其视为根级别项目.我正在尝试将我的平面阵列放入一棵树中.我发现的其他示例只将元素复制到父元素,但原始元素仍然存在.

编辑

起始数组的每个元素都是从一个单独的 XML 文件中读取的.如果文件没有父级,则文件本身的 parent_id 值将为0".键实际上是字符串.

我很抱歉之前的混乱.希望这更清楚:

/编辑

我的起始数组:

<前>大批([_319_] => 数组([id] => 0[parent_id] => 0)[_320_] => 数组([id] => _320_[parent_id] => 0)[_321_] => 数组([id] => _321_[parent_id] => _320_)[_322_] => 数组([id] => _322_[parent_id] => _321_)[_323_] => 数组([id] => _323_[parent_id] => 0)[_324_] => 数组([id] => _324_[parent_id] => _323_)[_325_] => 数组([id] => _325_[parent_id] => _320_))

生成树后的结果数组:

<前>大批([_319_] => 数组([id] => _319_[parent_id] => 0)[_320_] => 数组([id] => _320_[parent_id] => 0[儿童] => 数组([_321_] => 数组([id] => _321_[parent_id] => _320_[儿童] => 数组([_322_] => 数组([id] => _322_[parent_id] => _321_)))[_325_] => 数组([id] => _325_[parent_id] => _320_))[_323_] => 数组([id] => _323_[parent_id] => 0[儿童] => 数组([_324_] => 数组([id] => _324_[parent_id] => _323_)))

非常感谢任何帮助/指导!

到目前为止我有一些代码:

<前>函数 buildTree(array &$elements, $parentId = 0) {$branch = array();foreach ($elements 作为 $element) {如果 ($element['parent_id'] == $parentId) {$children = $this->buildTree($elements, $element['id']);如果($儿童){$element['children'] = $children;}$branch[] = $element;}}返回 $branch;}

解决方案

你忘记了 unset() 兄弟.

function buildTree(array &$elements, $parentId = 0) {$branch = array();foreach ($elements 作为 $element) {如果 ($element['parent_id'] == $parentId) {$children = buildTree($elements, $element['id']);如果($儿童){$element['children'] = $children;}$branch[$element['id']] = $element;unset($elements[$element['id']]);}}返回 $branch;}

I've looked around the internet and haven't quite found what I'm looking for. I have a flat array with each element containing an 'id' and a 'parent_id'. Each element will only have ONE parent, but may have multiple children. If the parent_id = 0, it is considered a root level item. I'm trying to get my flat array into a tree. The other samples I have found only only copy the element to the parent, but the original still exists.

EDIT

Each element of the starting array is read from a separate XML file. The file itself will have '0' as the value for parent_id if it doesn't have a parent. The keys are actually strings.

I'm sorry for the confusion earlier. Hopefully this is more clear:

/EDIT

My starting array:

Array
(
    [_319_] => Array
        (
            [id] => 0
            [parent_id] => 0
        )

    [_320_] => Array
        (
            [id] => _320_
            [parent_id] => 0
        )

    [_321_] => Array
        (
            [id] => _321_
            [parent_id] => _320_
        )

    [_322_] => Array
        (
            [id] => _322_
            [parent_id] => _321_
        )

    [_323_] => Array
        (
            [id] => _323_
            [parent_id] => 0
        )

    [_324_] => Array
        (
            [id] => _324_
            [parent_id] => _323_
        )

    [_325_] => Array
        (
            [id] => _325_
            [parent_id] => _320_
        )
)

The resulting array after the tree is made:

Array
(
    [_319_] => Array
        (
            [id] => _319_
            [parent_id] => 0
        )

    [_320_] => Array
        (
            [id] => _320_
            [parent_id] => 0
            [children] => Array
                (
                    [_321_] => Array
                        (
                            [id] => _321_
                            [parent_id] => _320_
                            [children] => Array
                                (
                                    [_322_] => Array
                                        (
                                            [id] => _322_
                                            [parent_id] => _321_
                                        )
                                )
                        )
                    [_325_] => Array
                        (
                            [id] => _325_
                            [parent_id] => _320_
                        )
                )
    [_323_] => Array
        (
            [id] => _323_
            [parent_id] => 0
            [children] => Array
                (
                    [_324_] => Array
                        (
                            [id] => _324_
                            [parent_id] => _323_
                        )
                )
        )

Any help / guidance is greatly appreciated!

Some code I have so far:


        function buildTree(array &$elements, $parentId = 0) {
        $branch = array();

        foreach ($elements as $element) {
            if ($element['parent_id'] == $parentId) {
                $children = $this->buildTree($elements, $element['id']);
                if ($children) {
                    $element['children'] = $children;
                }
                $branch[] = $element;
            }
        }

        return $branch;
    }

解决方案

You forgot the unset() in there bro.

function buildTree(array &$elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[$element['id']] = $element;
            unset($elements[$element['id']]);
        }
    }
    return $branch;
}

这篇关于从 PHP 中的平面数组构建一棵树的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆