PHP实现无限分类的实现方法


Posted in PHP onNovember 14, 2016

无限级分类是一种设计技巧,在开发中经常使用,例如:网站目录、部门结构、文章分类。笔者觉得它在对于设计表的层级结构上面发挥很大的作用,比如大家在一些平台上面,

填写邀请人,它就是一种上下级的关系,上级会有多个下级,下级又会有自己的分支,大多数都是利用递归的思想去实现。话不多说,首先来温故一下递归的实现

递归(程序调用自身的编程技巧):

1、$_GLOBALS[result]

2、static $result

3、参数引用&

举例:遍历1-10

```
$i=0;
function deeploop( $i ){
  global $i;
  $i++;
  echo $i;
  if( $i<10 ){
    deeploop($i);
  }

}

function deeploop( ){
  static $i=0;
  $i++;
  echo $i;
  if( $i<10 ){
    deeploop($i);
  }

}


function deeploop( &$i=0 ){
  $i++;
  echo $i;
  if( $i<10 ){
    deeploop($i);
  }

}

```

一、无限分类实现:

1、表设计设置父id 顶级父id设为0   建立族谱树;每一个分类都需记录它的父级id。( pid=0 代表顶级 )   

id pid catename cateorder createtime  ( 主键id,父id,分类name,分类排序,创建时间)

举例:网站的分类目录结构;餐饮的分类结构;评论的结构

 2、全路径无限分类(以一个字段将所有父级id按顺序记录下来)

 id path catename cateorder createtime  ( 主键id,逗号分隔的顺序排列父id,分类name,分类排序,创建时间)

优缺点:

全路径查询方便;增加,移动分类时数据维护稍显复杂;

二、举例实现(网站目录):

分类表:

```
    #父级Id递归法
    CREATE TABLE `deepcate`(
      `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `pid` int(11) NOT NULL DEFAULT 0,
      `catename` char(25) NOT NULL,
      `cateorder` int(6) ,
      `createtime` date
    )ENGINE=INNODB default CHARSET=utf8;
    
    
    //数据
    INSERT INTO `deepcate` VALUES(1,0,'图片',null,'2016-11-01'),
                  ( 2,1,'美女',null,'2016-11-01'),
                  ( 3,1,'新闻',null,'2016-11-01'),
                  ( 4,2,'足球宝贝',null,'2016-11-01'),
                  ( 5,2,'日韩明星',null,'2016-11-01'),
                  ( 6,5,'美女写真',null,'2016-11-01');
                  
    #全路径
    CREATE TABLE `qljcate` (
      `id` int(11) NOT NULL,
      `path` char(255) ,
      `catename` char(25) NOT NULL,
      `cateorder` int(6),
      `createtime` date
    )ENGINE=INNODB default CHARSET=utf8;
    
    INSERT INTO `qljcate` VALUES( 1,null,'图片',null,'2016-11-01'),
                  ( 2,1,'美女图片',null,'2016-11-01'),
              ( 3,1,2,'足球宝贝',null,'2016-11-01'),
                  ( 4,1,2,'日韩明星',null,'2016-11-01'),
                  ( 5,1,2,4,'美女写真',null,'2016-11-01');
  ```

    获取图片所在的目录路径:
  

```
    #父级Id递归法
    CREATE TABLE `deepcate`(
      `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `pid` int(11) NOT NULL DEFAULT 0,
      `catename` char(25) NOT NULL,
      `cateorder` int(6) ,
      `createtime` date
    )ENGINE=INNODB default CHARSET=utf8;
    
    
    //数据
    INSERT INTO `deepcate` VALUES(1,0,'图片',null,'2016-11-01'),
                  ( 2,1,'美女',null,'2016-11-01'),
                  ( 3,1,'新闻',null,'2016-11-01'),
                  ( 4,2,'足球宝贝',null,'2016-11-01'),
                  ( 5,2,'日韩明星',null,'2016-11-01'),
                  ( 6,5,'美女写真',null,'2016-11-01');
                  
    #全路径
    CREATE TABLE `qljcate` (
      `id` int(11) NOT NULL,
      `path` char(255) ,
      `catename` char(25) NOT NULL,
      `cateorder` int(6),
      `createtime` date
    )ENGINE=INNODB default CHARSET=utf8;
    
    INSERT INTO `qljcate` VALUES( 1,null,'图片',null,'2016-11-01'),
                  ( 2,1,'美女图片',null,'2016-11-01'),
              ( 3,1,2,'足球宝贝',null,'2016-11-01'),
                  ( 4,1,2,'日韩明星',null,'2016-11-01'),
                  ( 5,1,2,4,'美女写真',null,'2016-11-01');
  ```

*注意点:

移动分类不能移到自己及其子类下面;删除分类 (只能删除最底层的分类,及不含子类的分类;换言之,只能从最底层删起).

   思考图片类型下所有的图片分类? 

```
  #pid 父级id实现法
  function GetAllcate( $id,&$result=array() ){
    $sql = "SELECT * FROM deepcate WHERE pid in ({$id})";
    $query = mysql_query( $sql );
    $row = mysql_fetch_assoc( $query );
    if( mysql_num_rows($row)>0 )
    {
      $idlist = array();
      while( $row ){
        $result[] = $row;
        $idlist[] = $row['id']; 
      }
      $id = implode(',',$idlist);
      GetAllcate( $id,$result );
    
    }
    
    $result = array_unique( $result );
    return $result;
  }
  ```

此类方法比较适用于查询所在父分类下所有的书籍、文章。。。当然,全路径可以直接获取,就不再此提出了。

实际操作中,我们可以根据实际情况设计合理的表结构。

举个实例,连锁门店实现商品的管理,门店的账户设置就会存在上下级关系,根据代理点的分区可能存在这种下级拥有自己下级,那么采用这种无限分类的方法就比较灵活面对这种关系体系,只需设定每个账户等级,就能对不同的门店设定权限分配。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php切割页面div内容的实现代码分享
Jul 31 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
学习php开源项目的源码指南
Dec 21 PHP
php中header设置常见文件类型的content-type
Jun 23 PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
Sep 23 PHP
PHP实现多级分类生成树的方法示例
Feb 07 PHP
php strftime函数的详细用法
Jun 21 PHP
asp函数split()对应php函数explode()
Feb 27 PHP
详解PHP PDO简单教程
May 28 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 #PHP
PHP编写daemon process 实例详解
Nov 13 #PHP
php版微信小店API二次开发及使用示例
Nov 12 #PHP
PHP Mysqli 常用代码集合
Nov 12 #PHP
PHP版微信小店接口开发实例
Nov 12 #PHP
PHP错误和异常处理功能模块示例
Nov 12 #PHP
php版微信小店调用api示例代码
Nov 12 #PHP
You might like
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
php检测文本的编码
2015/07/26 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
采用call方式实现js继承
2014/05/20 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python中Continue语句的用法的举例详解
2015/05/14 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
使用Python实现分别输出每个数组
2019/12/06 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
CSS3伪类选择器:nth-child()
2009/04/02 HTML / CSS
JSP&Servlet技术面试题
2015/05/21 面试题
应届生求职推荐信
2013/10/28 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
运动会广播稿150字(9篇)
2014/09/20 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
解析目标检测之IoU
2021/06/26 Python
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL