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

二、递归实现无限极分类

//1、递归实现无限极分类

function getTree($array, $pid = 0, $level = 1)
{
    // dd($array);
    $list =array();
    foreach ($array as $key=>$v) {
        if ($v['parent_id'] == $pid) {
            $v['level'] = $level;
            $v['node']=getTree($array, $v['id'], $level + 1);
            $list[] = $v;
            //把这个节点从数组中移除,减少后续递归消耗
            unset($array[$key]);
        }
    }
    return $list;
}


//2、递归实现无限极分类数组层级缩进转换 注意:带level深度的

function getTree2($array, $pid = 0, $level = 1){
    static $list = [];
    foreach ($array as $key=>$v) {
        if ($v['parent_id'] == $pid) {
            $v['level'] = $level;
              $list[] = $v;
            //把这个节点从数组中移除,减少后续递归消耗
           unset($array[$key]);
            getTree2($array, $v['id'], $level + 1);
        }
    }
    return $list;
}

 

三、效果

1、递归方式

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
                                        )

                                )

                        )

                )

        )

)

 

2、数组层级缩进 带level深度的
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => 陕西
            [parent_id] => 0
            [level] => 1
        )

    [1] => Array
        (
            [id] => 2
            [name] => 西安
            [parent_id] => 1
            [level] => 2
        )

    [2] => Array
        (
            [id] => 3
            [name] => 长安区
            [parent_id] => 2
            [level] => 3
        )

    [3] => Array
        (
            [id] => 4
            [name] => 河南
            [parent_id] => 0
            [level] => 1
        )

    [4] => Array
        (
            [id] => 5
            [name] => 郑州
            [parent_id] => 4
            [level] => 2
        )

    [5] => Array
        (
            [id] => 6
            [name] => 河北
            [parent_id] => 0
            [level] => 1
        )

    [6] => Array
        (
            [id] => 7
            [name] => 石家庄
            [parent_id] => 6
            [level] => 2
        )

    [7] => Array
        (
            [id] => 8
            [name] => 新华区
            [parent_id] => 7
            [level] => 3
        )

)

  

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