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 和 XML: 使用expat函数(一)
Oct 09 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
非常精妙的PHP递归调用与静态变量使用
Dec 16 PHP
php实现utf-8和GB2312编码相互转换函数代码
Feb 07 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 PHP
php数据类型判断函数有哪些
Sep 23 PHP
php中数字0和空值的区别分析
Jun 05 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 PHP
Yii2框架实现数据库常用操作总结
Feb 08 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 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
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
JsChart组件使用详解
2018/03/04 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
layer弹出层扩展主题的方法
2019/09/11 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
大学毕业生通用求职信
2013/09/28 职场文书
护士个人简历自荐信
2013/10/18 职场文书
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
酒店个人求职信范文
2014/01/25 职场文书
简历里的自我评价
2014/01/31 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
宣传部部长竞选稿
2015/11/21 职场文书
高中班主任寄语
2019/06/21 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书