一、 概念
1、無限極分類
無限極分類就相當於樹型結構。一個父級類可以分成很多個子類,然后一個子類又可以分成很多個子類…這樣無限分下去就叫無限極分類。
圖1-1 樹型結構
2、家譜樹與子孫樹
家譜樹:從當前節點出發,尋找其父節點、父節點的兄弟節點和父節點的父節點直至根節點為止,一代代找上去形成的樹型結構,叫做家譜樹。
圖1-2 家譜樹結構
子孫樹:從當前節點出發,尋找其子節點,子節點的兄弟節點和子結點的子結點直到遍歷完全部子節點,這樣形成的樹型結構,叫做子孫樹。
圖1-3 子孫樹結構
二、 使用場景
windows操作系統下的文件分類就是無限極分類方式;
前端實現面包屑導航時,可以使用無限極分類;
在需要使用選擇城市的菜單時,可以使用無限極分類,使每個選項按照省級市級分類清楚。下面我們用tp5實現一個選擇城市的下拉框,來具體實現無限極分類。
圖2-1 選擇城市
三、 技術實現
1、想要實現無限極分類,首先我們要先了解遞歸算法:就是一個函數直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解(詳解見:https://cloud.tencent.com/developer/article/1356049)。
例如:我們需要求100的階乘。
圖3-1 不使用遞歸:
圖3-2 使用遞歸:
2、了解了遞歸算法后,我們使用tp5來實現無限極分類。
1)、為了實現無限極分類,我們先在數據庫中建立一張表來存放信息
字段名 |
數據類型 |
長度 |
是否為空 |
默認 |
描述 |
Id |
Smallint |
默認 |
否 |
無 |
主鍵,自增,欄目id |
catename |
varvhar |
32 |
否 |
無 |
欄目名稱 |
Type |
tinyint |
1 |
否 |
1 |
欄目類型 |
Pid |
Mediumint |
默認 |
否 |
0 |
上級欄目id |
2)、前端展示頁
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <title>無限極分類t</title> </head> <body> <h1>無限級分類</h1> <form action="{:url(‘sel’)}" method="post"> 請選擇上級分類:<select name="pid"> <option value="0">頂級分類</option> {volist name="cateres" id="cate"} //從數據庫調取數據 <option value={$cate.id}>
{if condition="$cate['level'] neq 0"}|{/if}
<?php echo str_repeat('-',$cate['level']*8);?>
{$cate.catename}
</option> {/violist} </select><br/> </form> </body> </html>
3)、tp5在model層對數據進行處理
//無限級分類開始 public function catetree() { $cateres=$this->select(); return $this->sort($cateres); } public function sort($data,$pid=0,$level=0) { static $arr=array(); //創建靜態數組 foreach ($data as $key => $value) { //循環操作所有的分類 if($value['pid']==$pid){ //找出第一個頂級分類 $value['level']=$level;//給頂級分類賦一個層級 $arr[]=$value; //將頂級分類放入空數組中 $this->sort($data,$value['id'],$level+1);//將所有分類進行一個排序 } } return $arr; } //無限級分類結束
4)、tp5在contoller層對數據進行操作
<?php namespace app\admin\controller; use think\Controller; //引用controller類 class Cate extends Controller { public function sel() { $cateres=$cate->catetree(); $this->assign('cateres',$cateres); return view(); } }