PHP無限遞迴選單的實現流程
這幾天看到TP裡關於無線分類搞得蠻火的,各種程式碼亂飛。我也釋出一個我的思路。使用的是遞迴,程式碼很簡潔,十行左右。
我的資料庫結構是這樣的,我的欄目只有一張表。
cid fatherid name
主鍵 父欄目標識 名稱
我看到,很多教程裡說使用類似0-1-2-3這樣的路徑法,還有lv=3的層次法,其實大致都一樣,只是實現的方式不同而已。我的方法使用的是遞迴,也比較好理解。
直接上程式碼了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//首先做一個類內的變數,儲存一下相關的陣列: 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無限級分類的實現(不使用遞迴)PHP遞迴
- php利用遞迴函式實現無限級分類PHP遞迴函式
- php 無限分類遞迴 和 無限分類引入 的效能差距PHP遞迴
- ThinkPHP 無限遞迴PHP遞迴
- Ztree + PHP 無限級節點遞迴查詢PHP遞迴
- 選單的無限極分類實現
- Java實現多級選單(遞迴)Java遞迴
- 無限遞迴導致StackOverflowError遞迴Error
- sql無限遞迴查詢SQL遞迴
- Vue遞迴元件實現樹形結構選單Vue遞迴元件
- PHP實現無限極分類PHP
- php陣列轉xml的遞迴實現PHP陣列XML遞迴
- 不用遞推實現無限極分類
- ViewPager實現左右無限迴圈滑動Viewpager
- 記MyBaits-Plus 實現選單的無限層關係AI
- PHP 樹-不需要遞迴的實現方法PHP遞迴
- php 遞迴函式的三種實現方式PHP遞迴函式
- el-menu使用遞迴元件實現多級選單元件遞迴元件
- 神坑·Python 裝飾類無限遞迴Python遞迴
- 二分法的簡單實現——-遞迴和非遞迴遞迴
- PHP無限級評論回覆功能實現PHP
- Vue 遞迴多級選單Vue遞迴
- Laravel - 選單遞迴及排序Laravel遞迴排序
- PHP + MySQL 無限分類實現的2種方法PHPMySql
- strcmp的遞迴實現遞迴
- Go語言實現excel匯入無限級選單結構GoExcel
- Python技法:實現簡單的遞迴下降ParserPython遞迴
- 棧實現遞迴遞迴
- lambda實現遞迴遞迴
- php短視訊原始碼,vue遞迴動態載入選單PHP原始碼Vue遞迴
- 無限for迴圈(死迴圈)
- 遞迴實現原則遞迴
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 斐波那契數列的遞迴和非遞迴實現遞迴
- oracle中的遞迴sql查詢 connect by prior實現遞迴Oracle遞迴SQL
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java