Php 如何在不使用引用的情况下从平面数组生成树状数组

Php 如何在不使用引用的情况下从平面数组生成树状数组,php,arrays,Php,Arrays,我一直致力于将平面数组转换为多维树状数组,所以我需要在没有参考资料的情况下做这件事 输入阵列: Array [ 1 =>[ 'content_id' => 1, 'sort_order' => 1, 'level' => 1 ], 2 =>[ 'content_id' => 7, 'sort_order' => 2, 'level' => 2

我一直致力于将平面数组转换为多维树状数组,所以我需要在没有参考资料的情况下做这件事

输入阵列:

Array
[
1 =>[
        'content_id' => 1,
        'sort_order' => 1,
        'level' => 1
    ],
2 =>[
        'content_id' => 7,
        'sort_order' => 2,
        'level' => 2
    ],
3 =>[
        'content_id' => 4,
        'sort_order' => 3,
        'level' => 2
    ],
4 =>[
        'content_id' => 2,
        'sort_order' => 4,
        'level' => 3
    ],
5 =>[
        'content_id' => 3,
        'sort_order' => 5,
        'level' => 1
    ],
6 =>[
        'content_id' => 6,
        'sort_order' => 6,
        'level' => 1
    ],
7 =>[
        'content_id' => 5,
        'sort_order' => 7,
        'level' => 2
    ]
]
1 => [
    'id' = 1,
    'visited' = 0,
    'children' => [
             2 => [
                  'id' => 7,
                  'visited' => 0,
                  'children' => []
             ],
             3 => [
                  'id' => 4,
                  'visited' => 0,
                  'children' => [
                           4 => [
                                'id' = 2,
                                'visited' = 0,
                                'children' => []
                           ]
             ]
],
5 => [
     'id' => 3,
     'visited' => 0,
     'children' => []
],
6 => [
     'id' => 6,
     'visited' => 0,
     'children' => [
             7 => [
                  'id' => 5,
                  'visited' => 0,
                  'children => []
             ]
]
]
输出阵列:

Array
[
1 =>[
        'content_id' => 1,
        'sort_order' => 1,
        'level' => 1
    ],
2 =>[
        'content_id' => 7,
        'sort_order' => 2,
        'level' => 2
    ],
3 =>[
        'content_id' => 4,
        'sort_order' => 3,
        'level' => 2
    ],
4 =>[
        'content_id' => 2,
        'sort_order' => 4,
        'level' => 3
    ],
5 =>[
        'content_id' => 3,
        'sort_order' => 5,
        'level' => 1
    ],
6 =>[
        'content_id' => 6,
        'sort_order' => 6,
        'level' => 1
    ],
7 =>[
        'content_id' => 5,
        'sort_order' => 7,
        'level' => 2
    ]
]
1 => [
    'id' = 1,
    'visited' = 0,
    'children' => [
             2 => [
                  'id' => 7,
                  'visited' => 0,
                  'children' => []
             ],
             3 => [
                  'id' => 4,
                  'visited' => 0,
                  'children' => [
                           4 => [
                                'id' = 2,
                                'visited' = 0,
                                'children' => []
                           ]
             ]
],
5 => [
     'id' => 3,
     'visited' => 0,
     'children' => []
],
6 => [
     'id' => 6,
     'visited' => 0,
     'children' => [
             7 => [
                  'id' => 5,
                  'visited' => 0,
                  'children => []
             ]
]
]

你知道如何在没有直接父关系集的情况下解决这样的问题吗?我可以使用递归,但引用是个问题。

ooh,这类问题确实让我觉得好笑。因此,以下是我的解决方案:

<?php

$origArray = array(
    array('content_id' => 1, 'sort_order' => 1, 'level' => 1),
    array('content_id' => 7, 'sort_order' => 2, 'level' => 2),
    array('content_id' => 4, 'sort_order' => 3, 'level' => 2),
    array('content_id' => 2, 'sort_order' => 4, 'level' => 3),
    array('content_id' => 3, 'sort_order' => 5, 'level' => 1),
    array('content_id' => 6, 'sort_order' => 6, 'level' => 1),
    array('content_id' => 5, 'sort_order' => 7, 'level' => 2),
);

function sortByOrder($a, $b) {
    if ($a['sort_order'] == $b['sort_order']) {
        return 0;
    }
    return ($a['sort_order'] < $b['sort_order']) ? -1 : 1;
}

function createHierarchicalArray($arr) {
    $result = array();
    foreach ($arr as $el) {
        $result = insertArrayElement($result, $el['content_id'], $el['level']);
    }
    return $result;
}

function insertArrayElement($array, $id, $level, $currentLevel = 1) {
    if ($level > $currentLevel) {
        $ids = array_keys($array);
        $currentId = end($ids);
        if (!isset($array[$currentId]['children'])) {
            $array[$currentId]['children'] = array();
        }
        $array[$currentId]['children'] = insertArrayElement($array[$currentId]['children'], $id, $level, $currentLevel + 1);
    } else {
        $array[$id] = array();
    }

    return $array;
}

// Could do without this, if the array is already sorted. Otherwise it's a necessary step.
uasort($origArray, 'sortByOrder');

$result = createHierarchicalArray($origArray);

var_dump($result);

您有两个相同的问题。删除其中一个我看不出在没有引用问题的情况下构建树状数组和修复已经编写好的使用引用问题的内容之间有什么关系。你的数组对我来说没有意义。您能在示例代码中尝试使用有效的PHP语法吗?^更好的方法是使用
var\u export
@Sherif:Done,这更好吗?抱歉,如果我更改了一些给您带来问题的内容,我希望我的编辑只更改了视觉表示。干得好,速度真快!有没有办法将原始元素中的其他数据保存到新数组中?我的意思是,我可能会将元素的id从原始数组传递给递归函数,然后在$array['$id]=array()行中从原始数组复制内容。有更好/更安全的方法吗?$currentKey可能应该是$currentId。另外,我们如何避免注意:“只有变量应该通过引用传递”?我会将原始数组的内容也传递给
insertArrayElement
函数(可能是第四个参数),并更改
$array[$id]=array()行到
$array[$id]=$el(或您决定调用参数的任何内容)。我已经更改了
$currentId=end(array\u key($array))行以消除引用传递通知。再次感谢您提供快速且真正干净的解决方案。