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

來源:互聯網
上載者:User

這幾天看到TP裡關於無線分類搞得蠻火的,各種代碼亂飛。我也發布一個我的思路。使用的是遞迴,代碼很簡潔,十行左右。
我的資料庫結構是這樣的,我的欄目只有一張表。

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

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


直接上代碼了:

//首先做一個類內的變數,儲存一下相關的數組: 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個欄目的遞迴都搞不定?如果你覺得慢了或者對效能有嚴重影響,還可以考慮使用緩衝,這樣一次使用,周期內都受益的,畢竟欄目不會每小時變一次吧?

喜歡討論的朋友可以加群252799167

本文出自 “尛雷” 部落格,請務必保留此出處http://a3147972.blog.51cto.com/2366547/1216069

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.