国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP無限遞歸菜單的實現流程

2020-03-22 17:57:15
字體:
來源:轉載
供稿:網友
  • 這幾天看到TP里關于無線分類搞得蠻火的,各種代碼亂飛。我也發布一個我的思路。使用的是遞歸,代碼很簡潔,十行左右。
    我的數據庫結構是這樣的,我的欄目只有一張表。

    cid    fatherid    name
    主鍵   父欄目標識   名稱

    我看到,很多教程里說使用類似0-1-2-3這樣的路徑法,還有lv=3的層次法,其實大致都一樣,只是實現的方式不同而已。我的方法使用的是遞歸,也比較好理解。


    直接上代碼了:


    //首先做一個類內的變量,存儲一下相關的數組:  html' target='_blank'>public $tree = null;  //然后做個測試方法,用于輸出結果  public function test() {         $res = M('channel')->where('fatherid is null')->select();         $this->createtree($res);         dump($this->tree);  }  //這里是遞歸方法  private function createtree(array $data = null, $lv = 1) {         for ($i = 0; $i < count($data); $i++) {             $data[$i]['lv'] = $lv;             $this->tree[count($this->tree)] = $data[$i];             $res = M('channel')->where('fatherid='.$data[$i]['cid'])->select();             $this->createtree($res, ($lv + 1));         }  }

    這里要說明一下,我的數據庫中的結構是,如果一個欄目為頂級欄目(沒有父欄目)的話,他的fatherid等于null的,而不是0,此處和別人的案例不一樣,因為我有一些外鍵,會使用到關聯模型,所以沒有使用0作為頂級分類標識。

    思路大致是這樣,將所有的頂級欄目找出來,然后開始遞歸,在遞歸的過程中,將層級關系寫入數組子元素中,這樣比較便于理解和使用。

    然后將該行記錄作為數組的最后一個元素插入。

    再去查詢,當前遞歸的欄目,是否還有子欄目,如果有則繼續發給遞歸方法去循環,這里沒有判斷子欄目返回值是否大于0,因為如果返回的是null,則不會開始循環,請注意遞歸方法的開頭FOR循環。

    最后的結果出來就是一個多維數組,每行記錄作為一個子元素,并且,頂級欄目的后面跟隨著他的所有子欄目。

    如果你需要對分類順序進行排列,可以使用order,不會有影響的。

    有人可能會問,這樣做會不會產生效率問題,我個人覺得,現在的分類說是無限級,其實不過是為了表達對層級關系的概念,不會有那個網站真分幾千個欄目的,起碼中國沒有。通常來說,200個欄目以內,屬于正常,這個代碼,就是性能再差,200個欄目的遞歸都搞不定?如果你覺得慢了或者對性能有嚴重影響,還可以考慮使用緩存,這樣一次使用,周期內都受益的,畢竟欄目不會每小時變一次吧?

    PHP編程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黑山县| 彰化市| 威信县| 岳阳县| 凤城市| 神木县| 松桃| 嵊泗县| 泸水县| 常熟市| 铜陵市| 柘城县| 乌鲁木齐县| 凌海市| 财经| 伊宁市| 宜君县| 开平市| 福安市| 扎兰屯市| 平凉市| 枣庄市| 革吉县| 报价| 张家口市| 伊吾县| 子长县| 承德县| 铁力市| 桂阳县| 遂川县| 诸城市| 高碑店市| 加查县| 怀宁县| 广宁县| 平武县| 永宁县| 雅江县| 海南省| 慈利县|