PHP 无限级分类数据库设计及实现

♖背景

  • 最近复习算法,在此对无限级分类的实现方法稍作整理,当然也是参考了道友的经验,目测适合实际的项目应用,当然,也有不少公司的笔试题还会涉及到呢,有何问题,欢迎各位道友指摘 …

操作环境:Win10 使用语言:PHP 使用框架:ThinkPHP 3.2.3

♘前期准备

①. 首先,实现无限级分类的方式有:

  1. 以父ID设计,运用递归实现的方式
  2. 以全路径实现的无限分类方式

②. 其次,数据表设计思路

  • 对应于上述的两种实现方式,那么在数据表设计时也可以有两种方式,参考所给的数据表截图

  1. 如果采用 父ID方式,字段只需使用 "id,pid,cate_name" 的主要三个即可
  2. 如果采用 全路径方式, 字段只需使用 "id,cate_name,path "的主要三个即可,注意:full_path 其实只作参考即可

♗代码实现

  • 此处,讲解几个核心方法,完整代码可根据后面的附录进行下载参考,请注意此处提及的核心处理代码都在文件ZmModel.class.php

①. 父ID 方式

  • 核心处理代码如下,注意参数备注信息,便于正确的调用
 /**
     * 数据库设计 递归方式 获取无限极分类数据 由上到下进行获取
     * @param int $pid      父级ID,默认为根级分类 0
     * @param int $sel_id   所选中的分类ID,多用于前端 selected 标识
     * @param array $result 数组整合
     * @param int $spac     空格间隔,便于前端缩进显示分类所属级别
     * @return array
     */
    public function deepCatesForDown($pid = 0,$sel_id = 0,&$result = [],$spac = 0){
        //空格数目
        $spac += 2;
        //从数据表中获取 父级ID为所需 pid 的全部数据
        $cateList = $this->db_cate
            ->where("pid = $pid")
            ->select();
        //TODO 进行遍历处理
        foreach ($cateList as $key => $value){
            //判断 selected 属性
            if ($sel_id == $value['id']){
                $selectedStr = "selected";
            }else{
                $selectedStr = "";
            }
            $cateList[$key]['cate_name'] = str_repeat('  ',$spac)
                .'|--'.$cateList[$key]['cate_name'] ;
            $cateList[$key]['selected'] = $selectedStr;
            $result[] = $cateList[$key];
            //TODO 此处进行了递归操作
            $this->deepCatesForDown($value['id'],$sel_id,$result,$spac);
        }
        return $result;
    }
  • 控制器调用参考:
$zmModel = new ZmModel();
$cateListDown = $zmModel->deepCatesForDown(0,6);
$this->assign('cateListDown',$cateListDown);
$this->display();
  • 前端Html数据显示参考:
<h4>递归方式获取 无限级分类数据</h4>
<select>
    <volist name="cateListDown" id="vo">
        <option {$vo.selected}>{$vo.cate_name}</option>
    </volist>
</select>

②. 全路径实现方式

  • 对应参考上面的介绍方式,核心处理代码如下
 /**
     * 全路径方式 获取无限极分类数据 由上到下进行获取
     * @return array
     */
    public function deepCatesFullPathForDown(){
        //注意排序方式 自动按要求进行排列
        $cateList = $this->db_cate
            ->field("id,cate_name,path,concat(path,',',id) full_path")
            ->order('full_path asc')
            ->select();
        $result = [];
        //遍历数据 方法同上
        foreach ($cateList as $key => $value){
            $deep = explode(',',trim($value['full_path'],','));
            $cateList[$key]['cate_name'] = str_repeat('&nbsp;&nbsp;',count($deep))
                ."|--".$cateList[$key]['cate_name'];
            $result[] = $cateList[$key];
        }
        return $result;
    }
  • 调用及前端显示代码参考同上

♔实现效果

  • 上述的参考代码,只做了下拉框的实现参考,对于全链接方式的实现可直接参考源代码

☠ 附录

源代码下载 >>>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LhWorld哥陪你聊算法

Nginx篇--解读nginx配置

之前讲解了Nginx的源码安装与加载到系统服务中去,http://www.cnblogs.com/LHWorldBlog/p/8298226.html 今天详细...

1643
来自专栏企鹅号快讯

前端实现本地图片读取与简单压缩功能

在上一篇文章Javascript 基础夯实 —— 通过代码构建一个包含文件的 FormData 对象中提到了前端压缩图片的功能,所以本篇文章就来实现一下这个功能...

3038
来自专栏流柯技术学院

Jmeter常用函数之__CSVRead使用

__CSVRead函数用于对脚本进行参数话,当脚本中不同变量需要不同参数值时,可以考虑__CSVRead函数。 以登录的用户名、密码为例:实际进行压力测试时,...

991
来自专栏技术博文

php性能监测模块XHProf

一,什么是XHProf XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开销,可...

3778
来自专栏陈纪庚

SPA页面初试

1022
来自专栏数据结构与算法

利用MingW检验程序运行内存

今天zhx老师在讲课的时候提到了一种检验程序内存的方法 一般计算内存的方法就是手算,手动计算代码中每个变量所占的内存然后加起来 具体可以参考这篇文章 zhx老师...

2826
来自专栏大数据杂谈

非常实用的九个程序员工具网站

2134
来自专栏james大数据架构

springmvc注入类 NoUniqueBeanDefinitionException: No qualifying bean of type [] is defined: expected sin

在springmvc中注入服务时用@Service 当有两个实现类时都标明@Service后则会出现异常: nested exception is org.sp...

2217
来自专栏微信公众号:Java团长

版本号命名指南

从上可以看出,不同的软件版本号风格各异,随着系统的规模越大,依赖的软件越多,如果这些软件没有遵循一套规范的命名风格,容易造成 Dependency Hell。所...

1161
来自专栏Petrichor的专栏

tensorflow编程: Running Graphs

  A class for running TensorFlow operations.   这是一个类,执行 tensorflow 中的 op 。它里面定...

1732

扫码关注云+社区

领取腾讯云代金券