thinkphp5使用无限极分类


Posted in PHP onFebruary 18, 2019

本文实例为大家分享了thinkphp5使用无限极分类的具体代码,供大家参考,具体内容如下

1. 先根据普通递归完成无限极分类

2. 再根据分号的类的level 添加字符,再次存入数组的_name字段,最后按照_name字段输出

/**
  * 获得树状数据
  * @param $data 数据
  * @param $title    数据库中字段名
  * @param string $fieldPri  数据库中主键id
  * @param string $fieldPid  数据库中父id
  * @return array
  */
 static public function tree($data, $title, $fieldPri = 'cid', $fieldPid = 'pid')
 {
  if (!is_array($data) || empty($data))
   return array();
  $arr = Data::channelList($data);
  foreach ($arr as $k => $v) {
   $str = "";
   if ($v['_level'] > 2) {
    for ($i = 1; $i < $v['_level'] - 1; $i++) {
     $str .= "│ ";
    }
   }
   if ($v['_level'] != 1) {
    $t = $title ? $v[$title] : "";
    if (isset($arr[$k + 1]) && $arr[$k + 1]['_level'] >= $arr[$k]['_level']) {
     $arr[$k]['_name'] = $str . "├─ " . $v['_html'] . $t;
    } else {
     $arr[$k]['_name'] = $str . "└─ " . $v['_html'] . $t;
    }
   } else {
    $arr[$k]['_name'] = $v[$title];
   }
  }
  //设置主键为$fieldPri
  $data = array();
  foreach ($arr as $d) {
   $data[$d[$fieldPri]] = $d;
  }
  return $data;
 }
/**
  * 获得所有子栏目
  * @param $data 栏目数据
  * @param int $pid 操作的栏目
  * @param string $html 栏目名前字符
  * @param string $fieldPri 表主键
  * @param string $fieldPid 父id
  * @param int $level 等级
  * @return array
  */
 static public function channelList($data, $pid = 0, $html = " ", $fieldPri = 'cid', $fieldPid = 'pid', $level = 1)
 {
  $data = self::_channelList($data, $pid, $html, $fieldPri, $fieldPid, $level);
  if (empty($data))
   return $data;
 
  foreach ($data as $n => $m) {
   if ($m['_level'] == 1)
    continue;//结束单次循环
   $data[$n]['_first'] = false;
   $data[$n]['_end'] = false;
   if (!isset($data[$n - 1]) || $data[$n - 1]['_level'] != $m['_level']) {
    $data[$n]['_first'] = true; 
   }
   if (isset($data[$n + 1]) && $data[$n]['_level'] > $data[$n + 1]['_level']) {
    $data[$n]['_end'] = true;
   }
  }
  //更新key为栏目主键
  $category=array();
  foreach($data as $d){
   $category[$d[$fieldPri]]=$d;
  }
  return $category;
 }
//只供channelList方法使用
 
 /**
  * 获得所有子栏目
  * @param $data 栏目数据
  * @param int $pid 操作的栏目
  * @param string $html 栏目名前字符
  * @param string $fieldPri 表主键
  * @param string $fieldPid 父id
  * @param int $level 等级
  * @return array
  */
 static private function _channelList($data, $pid = 0, $html = " ", $fieldPri = 'cid', $fieldPid = 'pid', $level = 1)
 {
  if (empty($data))
   return array();
  $arr = array();
 
  foreach ($data as $v) {
   $id = $v[$fieldPri];
   if ($v[$fieldPid] == $pid) {
    $v['_level'] = $level;
    $v['_html'] = str_repeat($html, $level - 1);
    $arr[] = $v;
 
    $tmp = self::_channelList($data, $id, $html, $fieldPri, $fieldPid, $level + 1);
    $arr = array_merge($arr, $tmp);//array_merge把两个数组整合为一个数组
   }
  }
  return $arr;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php数据库连接
Oct 09 PHP
PHP调用三种数据库的方法(2)
Oct 09 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
php中3种方法删除字符串中间的空格
Mar 10 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
May 06 PHP
PHP实现仿Google分页效果的分页函数
Jul 29 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
php str_replace替换指定次数的方法详解
May 05 PHP
浅谈PHP中如何实现Hook机制
Nov 14 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
May 02 PHP
PHP 实现链式操作
Mar 09 PHP
thinkphp5实现无限级分类
Feb 18 #PHP
php实现文章评论系统
Feb 18 #PHP
php无限级分类实现评论及回复功能
Feb 18 #PHP
PHP-FPM 的管理和配置详解
Feb 17 #PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 #PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 #PHP
PHP封装的mysqli数据库操作类示例
Feb 16 #PHP
You might like
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
javascript实现点击小图显示大图
2020/11/29 Javascript
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
html5使用canvas画一条线
2014/12/15 HTML / CSS
法律工作求职自荐信
2013/10/31 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
企业宣传稿范文
2015/07/23 职场文书
2016年国陪研修感言
2015/11/18 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
创业计划书之农家乐
2019/10/09 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
电频谱管理的原则是什么
2022/02/18 无线电
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js