1. 程式人生 > 其它 >php遞迴實現無限極分類

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


/遞迴實現無限極分類陣列層級縮排轉換 注意:帶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
        )

)

  

程式碼改變世界!