前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP 无限级分类数据库设计及实现

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

作者头像
泥豆芽儿 MT
发布2018-10-15 16:57:45
2.1K0
发布2018-10-15 16:57:45
举报

♖背景

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

操作环境: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 方式

  • 核心处理代码如下,注意参数备注信息,便于正确的调用
代码语言:javascript
复制
 /**
     * 数据库设计 递归方式 获取无限极分类数据 由上到下进行获取
     * @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;
    }
  • 控制器调用参考:
代码语言:javascript
复制
$zmModel = new ZmModel();
$cateListDown = $zmModel->deepCatesForDown(0,6);
$this->assign('cateListDown',$cateListDown);
$this->display();
  • 前端Html数据显示参考:
代码语言:javascript
复制
<h4>递归方式获取 无限级分类数据</h4>
<select>
    <volist name="cateListDown" id="vo">
        <option {$vo.selected}>{$vo.cate_name}</option>
    </volist>
</select>

②. 全路径实现方式

  • 对应参考上面的介绍方式,核心处理代码如下
代码语言:javascript
复制
 /**
     * 全路径方式 获取无限极分类数据 由上到下进行获取
     * @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;
    }
  • 调用及前端显示代码参考同上

♔实现效果

  • 上述的参考代码,只做了下拉框的实现参考,对于全链接方式的实现可直接参考源代码
在这里插入图片描述
在这里插入图片描述

☠ 附录

源代码下载 >>>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年10月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ♖背景
  • ♘前期准备
    • ①. 首先,实现无限级分类的方式有:
      • ②. 其次,数据表设计思路
      • ♗代码实现
        • ①. 父ID 方式
          • ②. 全路径实现方式
          • ♔实现效果
          • ☠ 附录
            • ❦ 源代码下载 >>>
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档