文档章节

php利用递归函数实现无限级分类

hansonwong
 hansonwong
发布于 2017/07/20 13:52
字数 1058
阅读 4
收藏 1

php利用递归函数实现无限级分类

  相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径。各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了。

  什么是无限级分类?

  无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了。其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类。分类无处不在,分类显得“无限”。我这里就不说无限分类的必要性了。

  无限级分类原理简介

  无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。

  闲话不多说,该展现本文的实例了。

  作为一个狂热海贼迷,这篇的实例我就以《海贼王》人物组织做案例。

  数据库准备: 

  建表onepiece:

create table onepiece(
    id int auto_increment,
    pid int not null,
    name varchar(225) not null,
    primary key(id)
);

   插入测试数据:

insert onepiece values
    (1,0,'海军'),
    (2,0,'海贼'),
    (3,0,'革命军'),
    (4,1,'青雉'),
    (5,1,'赤犬'),
    (6,1,'黄猿'),
    (7,2,'四皇'),
    (8,2,'七武海'),
    (9,2,'草帽海贼团'),
    (10,9,'索隆'),
    (11,7,'香克斯'),
    (12,8,'多弗朗明哥'),
    (13,8,'克洛克达尔');

  这里还是科普下海贼王里面的设定:世界分为三大阵营:海军,海贼,革命军。海军有大将:青雉,赤犬,黄猿。海贼有:四皇,七武海,草帽海贼团。四皇有香克斯,七武海有多弗朗明哥,克洛克达尔,草帽海贼团有索隆。(打个广告:海贼王真的很好看)。

  最终目的:

  我们今天制作的是两种形式的无限级分类形式,一种是下拉列表式,一种则是导航Link式的。直接上效果图了:

 

下拉列表式导航Link式

 

  实例代码:

  我封装了一个Unlimited类,用来调用diaplayList()展现下拉列表形式,调用diaplayLink展现导航Link分类。也可以增加(addNodes())和删除(deleteNodes)分类。 

<?php

class Unlimited{
    protected $mysqli;
    public function __construct($config){
        $this->mysqli=new mysqli($config['host'],$config['user'],$config['pwd']);
        $this->mysqli->select_db($config['db']);
        $this->mysqli->set_charset('utf8');
        if ($this->mysqli->connect_errno) {
            echo $this->mysqli->connect_error;
        }
    }    

    private function getList($pid=0,&$result=array(),$spac=0){
        $spac=$spac+2;
        $sql="select * from onepiece where pid={$pid}";
        $rs=$this->mysqli->query($sql);
        while($row=$rs->fetch_assoc()) {
            $row['name']=str_repeat('&nbsp;&nbsp',$spac).$row['name'];
            $result[]=$row;
            $this->getList($row['id'],$result,$spac);            
        }
        return $result;
    }
    /**
     * 展现下拉列表式分类
     * @return [type] 
     */
    public function displayList(){
        $rs=$this->getList();
        $str="<select name='cate'>";

        foreach ($rs as $key => $val) {
            $str.="<option >{$val['name']}</option>";
        }
        $str.="</select>";
        return $str;
    }

    private function getLink($cid,&$result=array()){
        $sql="select * from onepiece where id={$cid}";
        $rs=$this->mysqli->query($sql);
        if($row=$rs->fetch_assoc()){
            $result[]=$row;
            $this->getLink($row['pid'],$result);
        }
        return array_reverse($result);
    }
    /**
     * 展现导航Link
     * @param  [type] $cid [description]
     * @return [type]      [description]
     */
    public function displayLink($cid){
        $rs=$this->getLink($cid);
        $str='';
        foreach ($rs as $val) {
            $str.="<a href=''>{$val['name']}</a>>";
        }

        return $str;
    }
    /**
     * 增加分类
     * @param [type] $pid  父类id
     * @param [type] $name 本类名
     */
    public function addNodes($pid,$name){
        $sql="insert into onepiece values('',{$pid},'".$name."')";
        if($this->mysqli->query($sql)){

            return true;

        }
    }
    /**
     * 删除分类
     * @param  [type] $id 本类id
     * @return [type]     
     */
    public function deleteNodes($id){
        $sql="select * from onepiece where pid ={$id}";
        $rs=$this->mysqli->query($sql);
        if($row=$rs->fetch_assoc()){
            $mes="还有子元素,请勿删除";
        }else{
            $sql="delete from onepiece where id={$id}";
            if($this->mysqli->query($sql)){
                $mes="删除成功";
            }
        }
        return $mes;
    }
}

  类中函数主要采取了递归函数的方法,如果理解深刻理解递归函数,其余的部分也就水到渠成了。后面的php递归函数的三种方法详细介绍了php递归函数的原理

本文转载自:

共有 人打赏支持
hansonwong
粉丝 0
博文 33
码字总数 2227
作品 0
广州
加载中

评论(1)

贤郎--Querying
贤郎--Querying
加油吧!博主

暂无文章

awk命令扩展使用操作

awk 中使用外部shell变量 示例1 [root@centos01 t1022]# A=888[root@centos01 t1022]# echo "" | awk -v GET_A=$A '{print GET_A}'888[root@centos01 t1022]# echo "aaaaaaaaaaaaa" | aw......

野雪球
23分钟前
5
0
深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
今天
5
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
今天
6
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
12
0
JavaEE——Junit

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Junit Junit又名单元测试,Junit是用来测试Jav...

凯哥学堂
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部