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 相关文章推荐
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
提高PHP性能的编码技巧以及性能优化详细解析
Aug 24 PHP
php中filter函数验证、过滤用户输入的数据
Jan 13 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
Yii2隐藏frontend/web和backend/web的方法
Dec 12 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
php格式化时间戳
Dec 17 PHP
php UNIX时间戳用法详解
Feb 16 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
PHP yield关键字功能与用法分析
Jan 03 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
php date()日期时间函数详解
2010/05/16 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
修改js Calendar日历控件 兼容IE9/谷歌/火狐
2013/01/04 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
Python贪心算法实例小结
2018/04/22 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Python版中国省市经纬度
2020/02/11 Python
关于python 跨域处理方式详解
2020/03/28 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
盛大笔试题
2016/11/05 面试题
职代会闭幕词
2015/01/28 职场文书
嘉宾邀请函
2015/01/31 职场文书
五年级语文教学反思
2016/03/03 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书