php非递归实现无限极分类

一、数组

$categories = array(
    array('id'=>1,'name'=>'陕西','parent_id'=>0),
    array('id'=>2,'name'=>'西安','parent_id'=>1),
    array('id'=>3,'name'=>'长安区','parent_id'=>2),
    array('id'=>4,'name'=>'河南','parent_id'=>0),
    array('id'=>5,'name'=>'郑州','parent_id'=>4),
    array('id'=>6,'name'=>'河北','parent_id'=>0),
    array('id'=>7,'name'=>'石家庄','parent_id'=>6),
    array('id'=>8,'name'=>'新华区','parent_id'=>7));

二、非递归实现无限极分类

function getTree1($categories)
{
    //第一步,将分类id作为数组key,并创建node单元
    $tree = array();
    foreach($categories as $category){
        $tree[$category['id']] = $category;
        $tree[$category['id']]['node'] = array();
    }
    //第二步,利用引用,将每个分类添加到父类node数组中,这样一次遍历即可形成树形结构。
    foreach($tree as $key=>$item){
        if($item['parent_id'] != 0){
            $tree[$item['parent_id']]['node'][] = &$tree[$key];//注意:此处必须传引用否则结果不对
            if(empty($tree[$key]['node'])){
                unset($tree[$key]['node']); //如果node为空,则删除该node元素
            }
        }
    }
    //第三步,删除无用的非根节点数据
    foreach($tree as $key=>$category){
        if($category['parent_id'] != 0){
            unset($tree[$key]);
        }
        if(empty($tree[$key]['node'])){
            unset($tree[$key]['node']); //如果node为空,则删除该node元素
        }
    }
    //echo "<pre>"; print_r($tree);die;
    return array_values($tree);//改变数组的key从0开始
}


function getTree2($array, $parent_key = 'parent_id', $key = 'id', $children = 'node') {
    $res = [];
    foreach ($array as $value) {
        isset($res[$value[$parent_key]]) ?: $res[$value[$parent_key]] = [];
        isset($res[$value[$key]]) ?: $res[$value[$key]] = [];     
       //这里判断 删除空的数组
        if(in_array($value[$key], array_column($array, $parent_key))){
            $end=array_merge($value, [$children => &$res[$value[$key]]]);
        }else{
            $end=$value;
        }
        $res[$value[$parent_key]][] = $end;
    }
    return $res[0];
}

  

三、效果 注意:getTree1和getTree2的结果是一样的,可以任意选一种

Array
(
    [1] => Array
        (
            [id] => 1
            [name] => 陕西
            [parent_id] => 0
            [node] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [name] => 西安
                            [parent_id] => 1
                            [node] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 3
                                            [name] => 长安区
                                            [parent_id] => 2
                                        )

                                )

                        )

                )

        )

    [4] => Array
        (
            [id] => 4
            [name] => 河南
            [parent_id] => 0
            [node] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [name] => 郑州
                            [parent_id] => 4
                        )

                )

        )

    [6] => Array
        (
            [id] => 6
            [name] => 河北
            [parent_id] => 0
            [node] => Array
                (
                    [0] => Array
                        (
                            [id] => 7
                            [name] => 石家庄
                            [parent_id] => 6
                            [node] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 8
                                            [name] => 新华区
                                            [parent_id] => 7
                                        )

                                )

                        )

                )

        )

)

 

posted @ 2021-12-17 10:17  浪、子  阅读(284)  评论(0编辑  收藏  举报