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

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

通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类

第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下,

(1)建表:

-- ----------------------------

-- Table structure for pid

-- ----------------------------

DROP TABLE IF EXISTS `pid`;

CREATE TABLE pid (

id tinyint unsigned NOT NULL AUTO_INCREMENT primary key comment ‘主键id‘,

name varchar(32) NOT NULL,

nickname varchar(32) DEFAULT NULL,

pid tinyint(10) unsigned DEFAULT NULL,

sort mediumint(10) unsigned DEFAULT 50

) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

(2)插入数据:

-- ----------------------------

-- Records of pid

-- ----------------------------

INSERT INTO `pid` VALUES (‘1‘, ‘科技‘, ‘‘, ‘0‘, ‘50‘);

INSERT INTO `pid` VALUES (‘2‘, ‘军事‘, ‘‘, ‘0‘, ‘50‘);

INSERT INTO `pid` VALUES (‘3‘, ‘人与自然‘, ‘‘, ‘0‘, ‘50‘);

INSERT INTO `pid` VALUES (‘4‘, ‘美食‘, ‘‘, ‘0‘, ‘50‘);

INSERT INTO `pid` VALUES (‘5‘, ‘人工智能‘, ‘‘, ‘1‘, ‘50‘);

INSERT INTO `pid` VALUES (‘6‘, ‘机器人‘, ‘‘, ‘5‘, ‘50‘);

INSERT INTO `pid` VALUES (‘7‘, ‘无人飞机‘, ‘‘, ‘5‘, ‘50‘);

INSERT INTO `pid` VALUES (‘8‘, ‘无人汽车‘, ‘‘, ‘5‘, ‘50‘);

INSERT INTO `pid` VALUES (‘9‘, ‘军事机器人‘, ‘哈哈‘, ‘6‘, ‘50‘);

INSERT INTO `pid` VALUES (‘10‘, ‘服务机器人‘, ‘‘, ‘6‘, ‘50‘);

INSERT INTO `pid` VALUES (‘11‘, ‘航母‘, ‘‘, ‘2‘, ‘50‘);

INSERT INTO `pid` VALUES (‘12‘, ‘舰载机‘, ‘‘, ‘2‘, ‘50‘);

INSERT INTO `pid` VALUES (‘13‘, ‘预警机‘, ‘‘, ‘2‘, ‘50‘);

INSERT INTO `pid` VALUES (‘14‘, ‘导弹‘, ‘‘, ‘2‘, ‘50‘);

INSERT INTO `pid` VALUES (‘15‘, ‘舌尖上的中国‘, ‘‘, ‘3‘, ‘50‘);

INSERT INTO `pid` VALUES (‘16‘, ‘川菜‘, ‘‘, ‘15‘, ‘50‘);

INSERT INTO `pid` VALUES (‘17‘, ‘粤菜‘, ‘‘, ‘15‘, ‘50‘);

INSERT INTO `pid` VALUES (‘18‘, ‘湘菜‘, ‘‘, ‘15‘, ‘50‘);

INSERT INTO `pid` VALUES (‘19‘, ‘生物‘, ‘‘, ‘4‘, ‘50‘);

INSERT INTO `pid` VALUES (‘20‘, ‘动物‘, ‘‘, ‘19‘, ‘50‘);

INSERT INTO `pid` VALUES (‘21‘, ‘植物‘, ‘‘, ‘19‘, ‘50‘);

INSERT INTO `pid` VALUES (‘26‘, ‘哈哈‘, ‘哈哈‘, ‘0‘, ‘50‘);

INSERT INTO `pid` VALUES (‘27‘, ‘嘿嘿嘿‘, ‘嘿嘿嘿‘, ‘26‘, ‘50‘);

INSERT INTO `pid` VALUES (‘28‘, ‘嘘嘘嘘‘, ‘嘘嘘嘘‘, ‘26‘, ‘50‘);

数据表:

数据表大概就是这样。

第二步:进入正题,无限极分类

<?php
//设置字符集
header(‘content-type:text/html;charset=utf-8‘);

/**
 * 无限极分类
 * @param   $list array()
 * return array
 */
//无限极分类,实现具有父子关系的数据分类
function category($arr,$pid=0,$level=0){
    //定义一个静态变量,存储一个空数组,用静态变量,是因为静态变量不会被销毁,会保存之前保留的值,普通变量在函数结束时,会死亡,生长周期函数开始到函数结束,再次调用重新开始生长
    //保存一个空数组
    static $list=array();
    //通过遍历查找是否属于顶级父类,pid=0为顶级父类,
    foreach($arr as $value){
        //进行判断如果pid=0,那么为顶级父类,放入定义的空数组里
        if($value[‘pid‘]==$pid){
            //添加空格进行分层
            $arr[‘level‘]=$level;
            $list[]=$value;
            //递归点,调用自身,把顶级父类的主键id作为父类进行再调用循环,空格+1
            category($arr,$value[‘id‘],$level+1);
        }
    }
    return $list;//递归出口
}

连接数据:

效果:

2.一个小扩展:

这只是我自己理解的无限极分类,对于自己知识点的一些总结。有不妥的地方大家希望大家给些建议,共同学习,共同进步。thanks~

时间: 2024-10-08 20:04:37

递归的一些应用(二)无限极分类的相关文章

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, '

递归与无限极分类

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

C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Caching 我理解是在内容中实现,这种方法适用于单服务器的生产环境. 2.a Distributed Cache 分部式缓存实现. 3.Response Cache 这种方式我理解为客户端缓存. 今天我只用了第一种实现方法,内存中缓存,之所以用这种方法我是觉得我这里用缓存的初衷是为了减少访问数据库的次数,

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(

创建无限极分类树型结构

先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类信息(id:该分类的ID值,cate_name:该分类的名称,pid:父ID,sorts:为显示标题顺序排序做准备,可不写.) 1 public function cate_display() 2 { 3 $cate = D('Cate'); 4 $field = array('id','cate_

thinkphp5.0无限极分类及格式化输出

首先我们来看数据表 从上图中可以发现,中国下有贵州,北京两个子节点,而北京有天安门一个子节点,纽约的子节点是"纽约的子类". 从pid为0看出,中国和纽约是顶级节点. 因为贵州的pid是1,而中国的id为1,所以贵州的父节点是中国,至于type字段,可以不用管,只是我自己的项目需要. 可以发现,着写数据在数据表中是无序的,并没有我们想象中的层次结构分明并且可读性很好. 那么,当使用无限极分类之后数据的输出是怎样的呢?如下: 这样就能够很清晰的看出他们的层次结构了,那么这样的效果在thi