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中使用curl_init函数的说明
Nov 02 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
PHP中session变量的销毁
Feb 27 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
Jul 28 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
php强制运行广告的方法
Dec 01 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
使用PHP similar text计算两个字符串相似度
Nov 06 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
May 31 PHP
php mongodb操作类 带几个简单的例子
Aug 25 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 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
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
老生常谈js数据类型
2017/08/03 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
selenium+python实现自动登录脚本
2018/04/22 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
Python print不能立即打印的解决方式
2020/02/19 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
购房协议书范本
2014/04/11 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
工作检讨书范文
2015/01/23 职场文书
2015年反腐倡廉工作总结
2015/05/14 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
Redis 异步机制
2022/05/15 Redis