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中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
Dec 30 PHP
PHPMailer邮件发送的实现代码
May 04 PHP
php读取文件内容的方法汇总
Jan 24 PHP
php中二维数组排序问题方法详解
Aug 28 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
Sep 03 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
PHP基于openssl实现非对称加密代码实例
Jun 19 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执行速度全攻略
2006/10/09 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
php生成html文件方法总结
2014/12/01 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
分享jQuery封装好的一些常用操作
2016/07/28 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
Python 查看文件的读写权限方法
2018/01/23 Python
Python3 replace()函数使用方法
2018/03/19 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
应用电子专业学生的自我评价
2013/10/16 职场文书
高中自我评价分享
2013/12/05 职场文书
实习评语
2013/12/16 职场文书
新店开张活动方案
2014/08/24 职场文书
终止劳动合同通知书
2015/04/16 职场文书
幽默导游词开场白
2015/05/29 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
Python使用openpyxl批量处理数据
2021/06/23 Python