♖背景

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

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

♘前期准备

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

  1. 以父ID设计,运用递归实现的方式

  2. 以全路径实现的无限分类方式

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

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

  1. 如果采用 父ID方式,字段只需使用 "id,pid,cate_name" 的主要三个即可

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

img

♗代码实现

  • 此处,讲解几个核心方法,完整代码可根据后面的附录进行下载参考,请注意此处提及的核心处理代码都在文件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;
  }

复制

  • 调用及前端显示代码参考同上

♔实现效果

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

在这里插入图片描述

在这里插入图片描述

☠ 附录

源代码下载 >>>

所有评论
加载评论 ...
发表评论