Php 通过父级和id的引用构建树

Php 通过父级和id的引用构建树,php,arrays,recursion,multidimensional-array,reference,Php,Arrays,Recursion,Multidimensional Array,Reference,虽然我遇到了很多解决方案,但大多数都是基于递归的。如果有人能解释并将此函数从递归转换为php引用,我将不胜感激 // build tree for Tree users function buildTree(array $elements, $parentId = 0) { $branch = array(); foreach ($elements as $element) { if ((string)$element['parent_id'] === (st

虽然我遇到了很多解决方案,但大多数都是基于递归的。如果有人能解释并将此函数从递归转换为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),
)

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

可以在中找到双通道实现。每个未知的
parent\u id
成为新的根,子元素将被放置到
childNodes

$test=array(
数组('id'=>1,'name'=>a','parent\u id'=>0),
数组('id'=>3,'name'=>b','parent\u id'=>1),
数组('id'=>2,'name'=>c','parent\u id'=>1),
数组('id'=>8,'name'=>d','parent\u id'=>0),
数组('id'=>4,'name'=>e','parent\u id'=>0),
数组('id'=>5,'name'=>f','parent\u id'=>0),
数组('id'=>6,'name'=>i','parent\u id'=>0),
数组('id'=>7,'name'=>j','parent\u id'=>0),
数组('id'=>11,'name'=>k','parent\u id'=>7),
数组('id'=>9,'name'=>l','parent\u id'=>0),
数组('id'=>10,'name'=>m','parent\u id'=>7),
数组('id'=>12,'name'=>n','parent\u id'=>7),
数组('id'=>13,'name'=>o','parent\u id'=>7),
数组('id'=>14,'name'=>p','parent\u id'=>10),
数组('id'=>15,'name'=>q','parent\u id'=>10),
数组('id'=>16,'name'=>r','parent\u id'=>15),
数组('id'=>17,'name'=>s','parent_id'=>16),
数组('id'=>18,'name'=>t','parent\u id'=>17),
);
$forest=_transformResultToForest($test,'id','parent_id');
印刷(森林);
输出为:

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,因为这是一个很好的发现,尽管我的问题是关于递归函数的对话和解释