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

2021-09-21 09:44:41 字數 1639 閱讀 4867

這幾天看到tp裡關於無線分類搞得蠻火的,各種**亂飛。我也發布乙個我的思路。使用的是遞迴,**很簡潔,十行左右。

我的資料庫結構是這樣的,我的欄目只有一張表。

cid    fatherid    name

主鍵   父欄目標識   名稱

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

直接上**了:

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//首先做乙個類內的變數,儲存一下相關的陣列:

public$tree= null;

//然後做個測試方法,用於輸出結果

publicfunctiontest()

//這裡是遞迴方法

privatefunctioncreatetree(array$data= null,$lv= 1)

}

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

思路大致是這樣,將所有的頂級欄目找出來,然後開始遞迴,在遞迴的過程中,將層級關係寫入陣列子元素中,這樣比較便於理解和使用。

然後將該行記錄作為陣列的最後乙個元素插入。

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

最後的結果出來就是乙個多維陣列,每行記錄作為乙個子元素,並且,頂級欄目的後面跟隨著他的所有子欄目。

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

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

無限遞迴讀取選單演算法

1.選單 public class menu implements ientity2.service service public class menuservice extends baseservice 最後的結果 listmenulist new arraylist 先找到所有的一級選單 fo...

PHP實現選單無限極分類

一般的專案選單根據不同的使用者,不同的角色登入,顯示不同,如果僅僅用if else來判斷就顯得很笨拙,如果要修改選單就很麻煩。最好的方法就是把選單儲存在資料庫,然後從資料庫中取出,遍歷出來,顯示到頁面上。本文章的目的就是查詢出來的資料,如何把選單的韓上下級一 一對應 這裡我們的選單資料是臨時資料,沒...

PHP遞迴實現無限級分類

在一些複雜的系統中,要求對資訊欄目進行無限級的分類,以增強系統的靈活性。那麼php是如何實現無限級分類的呢?我們在本文中使用遞迴演算法並結合mysql資料表實現無限級分類。在一些複雜的系統中,要求對資訊欄目進行無限級的分類,以增強系統的靈活性。那麼php是如何實現無限級分類的呢?我們在本文中使用遞迴...