用PHP中的平面数组构建树

我环顾了互联网,但还没有完全找到想要的东西。我有一个平面数组,每个元素包含一个“ id”和一个“ parent_id”。每个元素只有一个父元素,但可能有多个子元素。如果parent_id = 0,则将其视为根级项目。我正在尝试将平面阵列变成一棵树。我发现的其他示例仅将元素复制到父元素,但原始元素仍然存在。


编辑


起始数组的每个元素都是从单独的XML文件中读取的。如果文件本身没有父文件,则其父文件ID的值将为'0'。键实际上是字符串。


对不起,我很困惑。希望这更加清楚:


/编辑


我的起始数组:


数组

    [_319_] =>数组

        (

            [id] => 0

            [parent_id] => 0

        )


    [_320_] =>数组

        (

            [id] => _320_

            [parent_id] => 0

        )


    [_321_] =>数组

        (

            [id] => _321_

            [parent_id] => _320_

        )


    [_322_] =>数组

        (

            [id] => _322_

            [parent_id] => _321_

        )


    [_323_] =>数组

        (

            [id] => _323_

            [parent_id] => 0

        )


    [_324_] =>数组

        (

            [id] => _324_

            [parent_id] => _323_

        )


    [_325_] =>数组

        (

            [id] => _325_

            [parent_id] => _320_

        )


万千封印
浏览 431回答 3
3回答

江户川乱折腾

你忘了unset()那里的兄弟。function buildTree(array &$elements, $parentId = 0) {    $branch = array();    foreach ($elements as $element) {        if ($element['parent_id'] == $parentId) {            $children = buildTree($elements, $element['id']);            if ($children) {                $element['children'] = $children;            }            $branch[$element['id']] = $element;            unset($elements[$element['id']]);        }    }    return $branch;}

慕娘9325324

ImmortalFirefly的解决方案正在发挥作用,但是,正如mrdd指出的那样,它无法挽救没有孩子的初生父母。我已经编辑了该函数来解决此问题:function buildTree(array &$elements, $parentId = 0) {    $branch = array();    foreach ($elements as &$element) {        if ($element['parent_id'] == $parentId) {            $children = buildTree($elements, $element['id']);            if ($children) {                $element['children'] = $children;            }            $branch[$element['id']] = $element;            unset($element);        }    }    return $branch;}

扬帆大鱼

这对我有用:$index=array();$tree=array();foreach ($ori as $key=>$var) {  $var=array_shift($ori);  if ($var['id']==0) $var['id']=$key;  if ((string)$var['parent_id']==='0') {    $tree[$key]=$var;    $index[$key]=&$tree[$key];  } else if (isset($index[$var['parent_id']])) {    if (!isset($index[$var['parent_id']]['children'])) $index[$var['parent_id']]['children']=array();    $index[$var['parent_id']]['children'][$key]=$var;    $index[$key]=&$index[$var['parent_id']]['children'][$key];  } else {    array_push($ori,$var);  }}unset($index);print_r($tree);
打开App,查看更多内容
随时随地看视频慕课网APP