使用其字段作为参数将数组重新嵌套到树中


Re-nest arrays into tree using its field as parameter

我的头发都掉光了…我有一个数组结构,print_r是这样的(我隐藏了不必要的字段):

[0] => Array
    (
        [id] => 14
        [name] => Foo Directory
    )
[1] => Array
    (
        [id] => 16
        [name] => Bar Project
        [parent] => Array
            (
                [id] => 14
                [name] => Foo Directory
            )
    )
[2] => Array
    (
        [id] => 20
        [name] => Baz Project
        [parent] => Array
            (
                [id] => 16
                [name] => Bar Project
            )
    )
[3] => Array
    (
        [id] => 10
        [name] => Qux Project
        [parent] => Array
            (
                [id] => 16
                [name] => Bar Project
            )

我需要它像这样嵌套:

[0] => Array
    (
        [id] => 14
        [name] => Foo Directory
        [children] => Array
            (
                [id] => 16
                [name] => Bar Project
                [children] => Array
                    (
                        [id] => 20
                        [name] => Baz Project
                    )
                    (
                        [id] => 10
                        [name] => Qux Project
                    )
            )
    )

我已经尽力了

$projTree = array();
    foreach ($projects as $project) {
        if (isset($project['parent'])) 
            array_push($projTree['children'], $project);
        $projTree['id'] = $project['parent']['id'];
    }

但是它会覆盖前面插入的元素。我也试图递归地遍历它,但无法找出正确的回调,因为它只在树的叶子上操作,我需要完全遍历它。

我该怎么做?谢谢!

请尝试如下:-

<?php
$array = Array(
    '0' => Array
    (
        'id' => 14,
        'name' => 'Foo Directory'
    ),
'1' => Array
    (
        'id' => 16,
        'name' => 'Bar Project',
        'parent' => Array
            (
                'id' => 14,
                'name' => 'Foo Directory'
            )
    ),
'2' => Array
    (
        'id' => 20,
        'name' => 'Baz Project',
        'parent' => Array
            (
                'id' => 16,
                'name' => 'Bar Project'
            )
    ),
'3' => Array
    (
        'id' => 10,
        'name' => 'Qux Project',
        'parent' => Array
            (
                'id' => 16,
                'name' => 'Bar Project'
            ) 
    )
);
$new_array = array();
$i = 0;
$j = 0;
foreach ($array as $key=>$val){
    if(array_key_exists('parent',$val)){
        foreach($new_array as $key1=>$val1){
            if($val['parent']['name'] === $val1['name']){
                $new_array[$key1]['children'][$i]['id'] = $val['id'];
                $new_array[$key1]['children'][$i]['name'] = $val['name'];
            }else{
                foreach ($val1['children'] as $key3=>$val3){
                    if($val['parent']['name'] === $val3['name']){
                        $new_array[$key1]['children'][$key3]['children'][$j]['id'] = $val['id'];
                        $new_array[$key1]['children'][$key3]['children'][$j]['name'] = $val['name'];
                    }
                    $j++;
                }
                $i++;
            }   
        }   
    }else{
        $new_array[$key] = $val;
    }
}
echo "<pre/>";print_r($new_array);

输出:https://eval.in/419591