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 相关文章推荐
Could not load type System.ServiceModel.Activation.HttpModule解决办法
Dec 29 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
浅析php中三个等号(===)和两个等号(==)的区别
Aug 06 PHP
php获取目录所有文件并将结果保存到数组(实例)
Oct 25 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
Nov 11 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 PHP
phpnow php探针环境检测代码
Nov 04 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
Nov 25 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
浅谈PHPANALYSIS提取关键字
Mar 08 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 金额数字转换成英文
2010/05/06 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
Python中的闭包总结
2014/09/18 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
python数据结构之图深度优先和广度优先实例详解
2015/07/08 Python
在Django框架中运行Python应用全攻略
2015/07/17 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
对Python强大的可变参数传递机制详解
2019/06/13 Python
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
2014年最新学习全国两会精神心得
2014/03/17 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
2015小学师德工作总结
2015/07/21 职场文书
老兵退伍感言
2015/08/03 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
Python爬虫实战之爬取携程评论
2021/06/02 Python