這幾天看到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;
//然後做個測試方法,用於輸出結果
public
function
test()
//這裡是遞迴方法
private
function
createtree(
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是如何實現無限級分類的呢?我們在本文中使用遞迴...