PHP實現無限極分類之遞歸方法

本篇文章給大家帶來的內容是關於php實現無限極分類的方法:遞歸方法

面試的時候被問到無限極分類的設計和實現,比較常見的做法是在建表的時候,增加一個PID字段用來區別自己所屬的分類

數據在數據庫中存儲大概是這個樣子,怎麼實現無限極遞歸呢,有兩種常用的做法,遞歸和引用算法

遞歸算法`

$array = array(
    array('id' => 1, 'pid' => 0, 'name' => '河北省'),
    array('id' => 2, 'pid' => 0, 'name' => '北京市'),
    array('id' => 3, 'pid' => 1, 'name' => '邯鄲市'),
    array('id' => 4, 'pid' => 2, 'name' => '朝陽區'),
    array('id' => 5, 'pid' => 2, 'name' => '通州區'),
    array('id' => 6, 'pid' => 4, 'name' => '望京'),
    array('id' => 7, 'pid' => 4, 'name' => '酒仙橋'),
    array('id' => 8, 'pid' => 3, 'name' => '永年區'),
    array('id' => 9, 'pid' => 1, 'name' => '武安市'),
    );

    /**
     * 遞歸實現無限極分類
     * @param $array 分類數據
     * @param $pid 父ID
     * @param $level 分類級別
     * @return $list 分好類的數組 直接遍歷即可 $level可以用來遍歷縮進
     */

    function getTree($array, $pid =0, $level = 0){
        //聲明靜態數組,避免遞歸調用時,多次聲明導致數組覆蓋
        static $list = [];
        foreach ($array as $key => $value){
            //第一次遍歷,找到父節點爲根節點的節點 也就是pid=0的節點
            if ($value['pid'] == $pid){
                //父節點爲根節點的節點,級別爲0,也就是第一級
                $value['level'] = $level;
                //把數組放到list中
                $list[] = $value;
                //把這個節點從數組中移除,減少後續遞歸消耗
                unset($array[$key]);
                //開始遞歸,查找父ID爲該節點ID的節點,級別則爲原級別+1
                getTree($array, $value['id'], $level+1);
            }
        }
        return $list;
    }

    /*
     * 獲得遞歸完的數據,遍歷生成分類
     */
    $array = getTree($array);
    //處理樣式,進行分級
    foreach($array as $value){
       echo str_repeat('--', $value['level']), $value['name'].'<br />';
    }

打印結果

河北省
–邯鄲市
----永年區
–武安市
北京市
–朝陽區
----望京
----酒仙橋
–通州區

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章