Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例


Posted in PHP onApril 04, 2020

本文实例讲述了Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点。分享给大家供大家参考,具体如下:

list_to_tree 使用起来十分方便,详细可查看手册。因为我在用的时候需要同时列出所有节点,所以写了一个递归函数,拿出来供大家参考。

public function index(){
  Load('extend');      //加载扩展方法
  $Category=D('Category');
  $list=$Category->order('sort desc')->select();//实现同级节点排序
  $list=list_to_tree($list,'id','fid'); //详细参数见手册
  $list=$this->findChild($list);
  dump($list);
}
protected function findChild($arr){
    static $tree=array();
    foreach ($arr as $key=>$val){
        $tree[]=$val;
        if (isset($val['_child'])){
          $this->findChild($val['_child']);
        }
      }
  return $tree;
}
/**
 * 把返回的数据集转换成Tree
 * @access public
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 */
function list_to_tree($list, $pk='id',$pid = 'pid',$child = '_child',$root=0) {
  // 创建Tree
  $tree = array();
  if(is_array($list)) {
    // 创建基于主键的数组引用
    $refer = array();
    foreach ($list as $key => $data) {
      $refer[$data[$pk]] =& $list[$key];
    }
    foreach ($list as $key => $data) {
      // 判断是否存在parent
      $parentId = $data[$pid];
      if ($root == $parentId) {
        $tree[] =& $list[$key];
      }else{
        if (isset($refer[$parentId])) {
          $parent =& $refer[$parentId];
          $parent[$child][] =& $list[$key];
        }
      }
    }
  }
  return $tree;
}

/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list,$field, $sortby='asc') {
  if(is_array($list)){
    $refer = $resultSet = array();
    foreach ($list as $i => $data)
      $refer[$i] = &$data[$field];
    switch ($sortby) {
      case 'asc': // 正向排序
        asort($refer);
        break;
      case 'desc':// 逆向排序
        arsort($refer);
        break;
      case 'nat': // 自然排序
        natcasesort($refer);
        break;
    }
    foreach ( $refer as $key=> $val)
      $resultSet[] = &$list[$key];
    return $resultSet;
  }
  return false;
}

/**
 * 在数据列表中搜索
 * @access public
 * @param array $list 数据列表
 * @param mixed $condition 查询条件
 * 支持 array('name'=>$value) 或者 name=$value
 * @return array
 */
function list_search($list,$condition) {
  if(is_string($condition))
    parse_str($condition,$condition);
  // 返回的结果集合
  $resultSet = array();
  foreach ($list as $key=>$data){
    $find  =  false;
    foreach ($condition as $field=>$value){
      if(isset($data[$field])) {
        if(0 === strpos($value,'/')) {
          $find  =  preg_match($value,$data[$field]);
        }elseif($data[$field]==$value){
          $find = true;
        }
      }
    }
    if($find)
      $resultSet[]   =  &$list[$key];
  }
  return $resultSet;
}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
MySQL 日期时间函数常用总结
Jun 12 PHP
一组PHP可逆加密解密算法实例代码
Jan 21 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
php微信开发之关键词回复功能
Jun 13 PHP
php面向对象程序设计中self与static的区别分析
May 21 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 17 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 #PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 #PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 #PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 #PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 #PHP
phpQuery采集网页实现代码实例
Apr 02 #PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 #PHP
You might like
php设计模式之观察者模式的应用详解
2013/05/21 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
php 猴子摘桃的算法
2017/06/20 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
Flask-Mail用法实例分析
2018/07/21 Python
python实现求特征选择的信息增益
2018/12/18 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
Python实现AI换脸功能
2020/04/10 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
网吧收银员岗位职责
2013/12/14 职场文书
学校班班通实施方案
2014/06/11 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
2014年稽查工作总结
2014/12/20 职场文书
撤诉申请怎么写
2015/05/19 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
详解nodejs内置模块
2021/05/06 NodeJs
详解MySQL主从复制及读写分离
2021/05/07 MySQL
如何利用python实现列表嵌套字典取值
2022/06/10 Python