1,使用父子pid方式進行遞歸排序。優勢理解簡單,相對直觀。壞處就是數據量龐大時效率低下。php
無限極分類遞歸排序方案sql
public function order($array,$pid=1,$num = 0){ $arr = array(); foreach($array as $v){ if($v['pid'] == $pid){ $num == 0 ? $v['name'] : $v['name'] = '|'.str_repeat('→',$num).$v['name']; $arr[] = $v; $arr = array_merge($arr,$this->order($array,$v['id'],$num + 1)); } } return $arr; }
2,path路徑方式。沒用過,但效率上跟遞歸應該沒有太大區別。this
3,左右值方式。spa
表以下,每一個分類都加入對應左右值。code
Type_id排序 |
Name遞歸 |
Lftci |
Rgtio |
1table |
商品 |
1 |
18 |
2 |
食品 |
2 |
11 |
3 |
肉類 |
3 |
6 |
4 |
豬肉 |
4 |
5 |
5 |
蔬菜類 |
7 |
10 |
6 |
白菜 |
8 |
9 |
7 |
電器 |
12 |
17 |
8 |
電視機 |
13 |
14 |
9 |
電冰箱 |
15 |
16 |
沒有直接的父類標記或路徑等。
1商品18
+---------------------------------------+
2食品11 12電器17
+-----------------+ +---------------------+
3肉類6 7蔬菜類10 13電視機14 15電冰箱16
4豬肉5 8白菜9
對節點「食品」及其子孫節點進行先序遍歷的列表,使用以下sql:
select * from tree where Lft between 2 and 11 order by Lft asc
Type_id |
Name |
Lft |
Rgt |
2 |
食品 |
2 |
11 |
3 |
肉類 |
3 |
6 |
4 |
豬肉 |
4 |
5 |
5 |
蔬菜類 |
7 |
10 |
6 |
白菜 |
8 |
9 |
子孫總數 =(右值-左值-1)/2
以節點「食品」舉例,其子孫總數=(11-2-1)/ 2 = 4
加減節點時對應加減後續節點的左右值。
此文章僅爲了保存思路。細節可自行百度查詢。