在PHP中使用平面数组构建树

DSk*_*ner 36 php arrays tree flat

我环顾互联网,并没有找到我正在寻找的东西.我有一个扁平数组,每个元素都包含'id'和'parent_id'.每个元素只有一个父元素,但可能有多个子元素.如果parent_id = 0,则将其视为根级别项.我想把我的扁平阵列变成一棵树.我发现的其他样本只将元素复制到父元素,但原始元素仍然存在.

编辑

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

我很抱歉早先的混乱.希望这更清楚:

/编辑

我的起始阵列:

Array
(
    [_319_] => Array
        (
            [id] => 0
            [parent_id] => 0
        )

    [_320_] => Array
        (
            [id] => _320_
            [parent_id] => 0
        )

    [_321_] => Array
        (
            [id] => _321_
            [parent_id] => _320_
        )

    [_322_] => Array
        (
            [id] => _322_
            [parent_id] => _321_
        )

    [_323_] => Array
        (
            [id] => _323_
            [parent_id] => 0
        )

    [_324_] => Array
        (
            [id] => _324_
            [parent_id] => _323_
        )

    [_325_] => Array
        (
            [id] => _325_
            [parent_id] => _320_
        )
)

树形成后的结果数组:

Array
(
    [_319_] => Array
        (
            [id] => _319_
            [parent_id] => 0
        )

    [_320_] => Array
        (
            [id] => _320_
            [parent_id] => 0
            [children] => Array
                (
                    [_321_] => Array
                        (
                            [id] => _321_
                            [parent_id] => _320_
                            [children] => Array
                                (
                                    [_322_] => Array
                                        (
                                            [id] => _322_
                                            [parent_id] => _321_
                                        )
                                )
                        )
                    [_325_] => Array
                        (
                            [id] => _325_
                            [parent_id] => _320_
                        )
                )
    [_323_] => Array
        (
            [id] => _323_
            [parent_id] => 0
            [children] => Array
                (
                    [_324_] => Array
                        (
                            [id] => _324_
                            [parent_id] => _323_
                        )
                )
        )

非常感谢任何帮助/指导!

到目前为止我有一些代码:


        function buildTree(array &$elements, $parentId = 0) {
        $branch = array();

        foreach ($elements as $element) {
            if ($element['parent_id'] == $parentId) {
                $children = $this->buildTree($elements, $element['id']);
                if ($children) {
                    $element['children'] = $children;
                }
                $branch[] = $element;
            }
        }

        return $branch;
    }

n0n*_*g0n 53

你忘了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;
}
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下,此解决方案可能无法正确构建树(即$ arr = array(array('id'=> 1,'parentid'=> 0),array('id'=> 10,'parentid'=> 2 ),array('id'=> 2,'parentid'=> 0),array('id'=> 3,'parentid'=> 10),array('id'=> 4,'parentid'=> 0),数组('id'=> 11,'parentid'=> 1),数组('id'=> 5,'parentid'=> 0),数组('id'=> 6,'pa​​rentid'= > 1),array('id'=> 8,'parentid'=> 11),array('id'=> 9,'parentid'=> 0),array('id'=> 7,'parentid' => 0),);)我建议:http://stackoverflow.com/questions/4196157/create-array-tree-from-array-list(Arthur的修改后的解决方案) (3认同)
  • 通过添加以下代码行,您可以获得更高的搜索性能:“array_splice($elements, $key, 1);” 在这一行之后:“if ($elmParent == $parentId) {” 保持这样:“... foreach ($elements as $key => $element) { if ($elmParent == $parentId) { array_splice($元素, $key, 1); ..." (2认同)

Ste*_*son 28

然而,ImmortalFirefly的解决方案正在发挥作用,正如mdded指出的那样,它没有拯救没有孩子的第一个父母.我编辑了修复此问题的函数:

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;
}
Run Code Online (Sandbox Code Playgroud)


Eug*_*eck 6

这对我有用:

$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);
Run Code Online (Sandbox Code Playgroud)