为了账号安全,请及时绑定邮箱和手机立即绑定

用PHP中的平面数组构建树

用PHP中的平面数组构建树

PHP
万千封印 2019-10-10 16:22:26
我环顾了互联网,但还没有完全找到想要的东西。我有一个平面数组,每个元素包含一个“ 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_        ))
查看完整描述

3 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

你忘了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;

}


查看完整回答
反对 回复 2019-10-10
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

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;

}


查看完整回答
反对 回复 2019-10-10
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

这对我有用:


$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);


查看完整回答
反对 回复 2019-10-10
  • 3 回答
  • 0 关注
  • 430 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信