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高级OOP技术演示
Aug 27 PHP
PHP企业级应用之常见缓存技术篇
Jan 27 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
PHP生成不同颜色、不同大小的tag标签函数
Sep 23 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
PHP正则提取不包含指定网址的图片地址的例子
Apr 21 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
浅析iis7.5安装配置php环境
May 10 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
PHP中创建和编辑Excel表格的方法
Sep 13 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
KindEditor在php环境下上传图片功能集成的方法示例
Jul 20 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抽象类 介绍
2012/06/13 PHP
php通过文件流方式复制文件的方法
2015/03/13 PHP
Javascript 函数对象的多重身份
2009/06/28 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
Python抓取框架 Scrapy的架构
2016/08/12 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
女大学生自我鉴定
2013/12/09 职场文书
保密工作责任书
2014/04/16 职场文书
家长对孩子的寄语
2015/02/26 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
天鹅湖观后感
2015/06/09 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
python3实现常见的排序算法(示例代码)
2021/07/04 Python
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python