具有重复子级的PHP分支递归

具有重复子级的PHP分支递归,php,recursion,tree,Php,Recursion,Tree,我有一个平面结构,我需要转换成嵌套的树状结构。这不同于,因为孩子们可以重复(即,可以有相同的问题ID和家长ID)。我试图用分支递归来解决这个问题,但运气不好 输入(平面阵列): 所需输出(嵌套数组): 您可以使用引用指针解决此问题: $newArray = array(); $pointer[] = &$newArray; foreach($arr as $ar) { if(stristr($ar['name'], "start")) { // Start

我有一个平面结构,我需要转换成嵌套的树状结构。这不同于,因为孩子们可以重复(即,可以有相同的问题ID和家长ID)。我试图用分支递归来解决这个问题,但运气不好

输入(平面阵列):

所需输出(嵌套数组):


您可以使用引用指针解决此问题:

$newArray = array();
$pointer[] = &$newArray;

foreach($arr as $ar) {

    if(stristr($ar['name'], "start")) {  // Start

        $pointer[] = &$pointer[count($pointer)-1][$ar['name']][];

    } else if(stristr($ar['name'], "end")) {  // End

        array_pop($pointer);

    } else {

        $pointer[count($pointer)-1][$ar['name']] = $ar['answer'];

    }
}
为了加快速度,您可以使用stripos($ar['name'],“start”)!=虚假的

[
    'albumName' => 'Album Name',
    'albumGenre' => 'Album Genre',
    'trackStart' => [
        [
            'trackName' => 'Track One'
        ],
        [
            'trackName' => 'Track Two',
            'artistStart' => [
                [
                    'artistName' => 'Artist Name'
                ]
            ]
        ]
    ],
    'albumDate' => 'album Date'
]
$newArray = array();
$pointer[] = &$newArray;

foreach($arr as $ar) {

    if(stristr($ar['name'], "start")) {  // Start

        $pointer[] = &$pointer[count($pointer)-1][$ar['name']][];

    } else if(stristr($ar['name'], "end")) {  // End

        array_pop($pointer);

    } else {

        $pointer[count($pointer)-1][$ar['name']] = $ar['answer'];

    }
}