【问题标题】:build tree by references with parents and id通过与父母和 id 的引用构建树
【发布时间】:2018-07-30 09:38:08
【问题描述】:

虽然我遇到了很多解决方案,但大多数都是基于递归的。如果有人可以解释并将此函数从递归转换为 php 引用,我将不胜感激。

// build tree for Tree users
function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ((string)$element['parent_id']  === (string)$parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['child'] = $children;
            }
            $branch[] = $element;
            // depthCommissionCalc($branch);  
        }
    }

    return $branch;
}

我确实尝试过自己,但由于我真的了解 php 引用概念,因此无法深入了解内部儿童。有许多通过 php 引用构建树的紧密解决方案,但它们都保留 ID 或父 ID 作为数组索引。这不是我想要的。比如这个

function create($data){
    foreach($data as &$v){
        // Get childs
        if(isset($tree[$v['id']])) $v['child'] =& $tree[$v['id']];

        // push node into parent
        $tree[$v['parent_id']][$v['id']] =& $v;             

        // push child into node
        $tree[$v['id']]   =& $v['child'];
    }
    // return Tree
    return $tree[0];
}

示例数组是

$test = array(
        array('id' => 1, 'name' => "a", 'parent_id' => 0),
        array('id' => 3, 'name' => "b", 'parent_id' => 1),
        array('id' => 2, 'name' => "c", 'parent_id' => 1),
        array('id' => 8, 'name' => "d", 'parent_id' => 0),
        array('id' => 4, 'name' => "e", 'parent_id' => 0),
        array('id' => 5, 'name' => "f", 'parent_id' => 0),
        array('id' => 6, 'name' => "i", 'parent_id' => 0),
        array('id' => 7, 'name' => "j", 'parent_id' => 0),
        array('id' => 11, 'name' => "k", 'parent_id' => 7),
        array('id' => 9, 'name' => "l", 'parent_id' => 0),
        array('id' => 10, 'name' => "m", 'parent_id' => 7),
        array('id' => 12, 'name' => "n", 'parent_id' => 7),
        array('id' => 13, 'name' => "o", 'parent_id' => 7),
        array('id' => 14, 'name' => "p", 'parent_id' => 10),
        array('id' => 15, 'name' => "q", 'parent_id' => 10),
        array('id' => 16, 'name' => "r", 'parent_id' => 15),
        array('id' => 17, 'name' => "s", 'parent_id' => 16),
        array('id' => 18, 'name' => "t", 'parent_id' => 17),
)

如果有人可以研究它并通过使用引用而不是递归和解释来帮助转换相同的函数,我将不胜感激。非常感谢!

【问题讨论】:

    标签: php arrays recursion multidimensional-array reference


    【解决方案1】:

    可以在DbSimple 中找到两遍实现。每个未知的parent_id 成为新的根,子元素将被放入childNodes

    $test = array(
            array('id' => 1, 'name' => "a", 'parent_id' => 0),
            array('id' => 3, 'name' => "b", 'parent_id' => 1),
            array('id' => 2, 'name' => "c", 'parent_id' => 1),
            array('id' => 8, 'name' => "d", 'parent_id' => 0),
            array('id' => 4, 'name' => "e", 'parent_id' => 0),
            array('id' => 5, 'name' => "f", 'parent_id' => 0),
            array('id' => 6, 'name' => "i", 'parent_id' => 0),
            array('id' => 7, 'name' => "j", 'parent_id' => 0),
            array('id' => 11, 'name' => "k", 'parent_id' => 7),
            array('id' => 9, 'name' => "l", 'parent_id' => 0),
            array('id' => 10, 'name' => "m", 'parent_id' => 7),
            array('id' => 12, 'name' => "n", 'parent_id' => 7),
            array('id' => 13, 'name' => "o", 'parent_id' => 7),
            array('id' => 14, 'name' => "p", 'parent_id' => 10),
            array('id' => 15, 'name' => "q", 'parent_id' => 10),
            array('id' => 16, 'name' => "r", 'parent_id' => 15),
            array('id' => 17, 'name' => "s", 'parent_id' => 16),
            array('id' => 18, 'name' => "t", 'parent_id' => 17),
    );
    
    
    $forest = _transformResultToForest($test, 'id', 'parent_id');
    print_r($forest);
    

    输出是:

    Array
    (
        [1] => Array
            (
                [name] => a
                [childNodes] => Array
                    (
                        [3] => Array
                            (
                                [name] => b
                                [childNodes] => Array
                                    (
                                    )
    
                            )
    
                        [2] => Array
                            (
                                [name] => c
                                [childNodes] => Array
                                    (
                                    )
    
                            )
    
                    )
    
            )
    
        [8] => Array
            (
                [name] => d
                [childNodes] => Array
                    (
                    )
    
            )
    ...
    

    【讨论】:

    • 嗨,感谢您的努力,我会尽快检查和测试!干杯
    • 对不起,我仍然很忙,但我想我会给你 +1 的好发现,虽然我的问题是关于递归函数的对话和解释
    猜你喜欢
    • 2015-03-02
    • 2019-12-14
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多