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
加减节点时对应加减后续节点的左右值。
此文章仅为了保存思路。细节可自行百度查询。