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;
    }
}
时间: 2024-11-03 01:16:54

php递归无限极分类实例的相关文章

php递归无限极分类

递归无限级分类有几种形式,我这里只举例比较常用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'pid' => 0, 'user_name' => 'one', ), 2 => array( 'id' => 2, 'pid' => 1, 'user_name' => 'two', ), 3 => array( 'id' => 3, 'pid' => 1, '

预排序遍历树算法(非递归无限极分类算法)

多层数据结构估计所有的web开发者估计都不会陌生,各种软件的分类都是基于多层结构来设计的. 下面是一个典型的多层数据结构示意图: 相关创建数据语句:CREATE TABLE category(category_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20) NOT NULL,parent INT DEFAULT NULL); INSERT INTO categoryVALUES(1,'ELECTRONICS',NULL),(2,'TELEVI

PHP无限极分类

概述 ??在实际工作中,经常要用到无限极分类.如导航表等等.到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱,代码很多,那些都不靠谱,还是自己捣鼓捣鼓无限极分类了.下面介绍两种无限极分类:递归,使用引用 数据准备 //初始化原始数据(id=>编号,name=>显示名称,pid=>父级目录id,sort=>排序顺序) $data[1] = array('id'=>'1','name'=>'一级目录A','pid'=>'0','sort'=>'1

递归与无限极分类

在函数内部调用本身,且在调用时要做判断. 例:输出1~9 function deeploop(&$i=1){   //引用传值,防止递归时从1开始 echo  $i; $i++; if($i < 10){             //条件判断,防止无限递归 deeploop($i); } } 2.无限极分类原理:每次分类都需要记录它的父级id,如果是顶级,则父级id为0,通过父级id,一层一层往下查. 首先从数据库中取出结果集,把结果集中的pid与顶级的pid开始,然后确定顶级父级.依次往下

递归的一些应用(二)无限极分类

用递归的方法实现无限极分类 通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ----------------------------

PHP无限极分类的实现(不使用递归)

无限极分类在开发中经常使用,例如:部门结构.文章分类.无限极分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在<无限级分类实现思路>一文中介绍了几种常见的实现方法,各有利弊.其中“改进前序遍历树”数据结构,便于输出和查询,但是在移动分类和常规理解上有些复杂. 2.数据结构 id fid title 1 0 中国 2 1 江苏 3 1 安徽 4 8 江阴 5 3 芜湖 6 3 合肥 7 3 蚌埠 8 2 无

用递归的方法实现无限极分类

通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ---------------------------- DROP TABLE IF

PHP实现无限极分类的两种方式,递归和引用

面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' => 0, 'name' => '河北省'), array('id' => 2, 'pid' => 0, 'name' => '北京市'), array('id' => 3, 'pid' => 1, 'name' => '邯郸市'), array('id' =>

php无限极分类以及递归(thinkphp)

php无限极分类: 无限极分类重点在于表的设计: 1在model中: class CatModel extends Model{ protected $cat = array(); public function __construct(){ parent::__construct(); $this->cats = $this->select(); } public function getTree($parent_id=0,$lev=0){ $tree = array(); foreach(