一、 概念
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> {/volist} </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 appadmincontroller; use thinkController; //引用controller类 class Cate extends Controller { public function sel() { $cateres=$cate->catetree(); $this->assign('cateres',$cateres); return view(); } }