• 喜欢前端以及PHP的朋友们可以加PHP同好会QQ群 点击加入qq群
  • 最近在写一个项目---"小A微信托管平台",大家可以去帮忙测试一下!功能在不断完善中,敬请关注!点击进入
  • 本站使用了PHP8.1与HTTP2.0协议,速度简直超级快有木有?

一个简单易理解的PHP无限极分类算法

后端 Mr.Adam 9年前 (2016-10-07) 2393次浏览 已收录 0个评论

一个简单易理解的 PHP 无限极分类算法

一个简单易理解的 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,我们也可以判断是第几层分类了!
过几天分享一个更加简便的分类算法!敬请期待哦! :cool:


小 A 空间 , 版权所有丨如未注明转载 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个简单易理解的 PHP 无限极分类算法
喜欢 (1)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址