一个简单易理解的 PHP 无限极分类算法
当做网站时,肯定会遇到分类这个问题,简单的如 1 级分类与 2 级分类,如果级数大于 3 个的话,我们数据库的设计上就会变得很繁琐臃肿,而且数据库查询也很麻烦,那么这时候我们就可以用一个简单的算法解决这类问题,用一张表就可以解决分类问题,不管是 3 级还是 4 级或者是无限级.
第一步:我们设计数据库
首先,数据库表设计必须有一个关联主键字段,数据库设计如下:
ID | name | pid |
---|---|---|
1 | php | 0 |
2 | mysql | 0 |
3 | javascript | 0 |
4 | php 类 | 1 |
5 | smarty | 1 |
6 | mysql 函数 | 2 |
7 | jquery | 3 |
其中 ID 为自增主键,name 为分类名称,pid 则为它们的关系列,从表中可以看出,php 类和 smarty 的 pid 其实是等于 php 的主键 ID,jquery 的 pid 等于 javascript 的主键 ID
第二步:实现无限极分类函数
class Catagray{ public $data=array(); public function getData(){ //从数据库查询出来的信息赋值给$data $this->data = $this->select(); } public function getTree($id=0 , $lev=0) { //1.定义一个空数组$tree $tree = array(); //2.开启一个 foreach 循环,循环$data foreach($this->data as $v) { //3.如果该项的 pid 值等于传入的$id 则执行以下语句 if($v['pid'] == $id) { //4.给循环中的数组增添一个单元"lev",将传入的$lev 赋值过去 $v['lev'] = $lev; //5.将整个循环数组放入$tree 中 $tree[] = $v; //6.此处产生递归,调用自身(返回值其实是$tree 这个数组)将返回值和函数中的$tree 用 array_merge 合并到一起,并将$lev+1 $tree = array_merge($tree , $this->getTree($v['id'] , $lev+1)); } } return $tree; } }
以上是一个简易的 php 类,其中 getData()函数的作用是去数据库查出所有分类的项目,它应该是一个如下数组形式:
$data=array( 0=>array("id"=>1,"name"=>"php","pid"=>0), 1=>array("id"=>2,"name"=>"mysql","pid"=>0), 2=>array("id"=>3,"name"=>"javascript","pid"=>0), 3=>array("id"=>4,"name"=>"php 类","pid"=>1), ... );
下面是 getTree()方法,里面传入 2 个参数,$id 默认为 0,为辨别分类有多少级,定义一个$lev 传入进去,每次递归使之加 1,
当 pid 与传入 id 相等时,我们就将整个单元放入我们自定义的$tree 中去,然后我们调用自身,自身的返回值与$tree 合并起来,
这样处理之后我们得到的数组就会变成如下这样(以上表数据做参考)
$tree = array( 0=>array("id"=>1,"name"=>"php","pid"=>0,"lev"=>0), 1=>array("id"=>4,"name"=>"php 类","pid"=>1,"lev"=>1), 2=>array("id"=>5,"name"=>"smarty","pid"=>1,"lev"=>1), 3=>array("id"=>2,"name"=>"mysql","pid"=>0,"lev"=>0), 4=>array("id"=>6,"name"=>"mysql 函数","pid"=>2,"lev"=>1), 5=>array("id"=>3,"name"=>"javascript","pid"=>0,"lev"=>0), ... );
这样我们的无限极分类就完成了,如果有第三级,第四级,那么数据就都会按照层级关系排列好,通过 lev,我们也可以判断是第几层分类了!
过几天分享一个更加简便的分类算法!敬请期待哦!