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 相关文章推荐
PHP开发大型项目的一点经验
Oct 09 PHP
提升PHP执行速度全攻略(上)
Oct 09 PHP
用PHP和ACCESS写聊天室(九)
Oct 09 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
table标签的结构与合并单元格的实现方法
Jul 24 PHP
php实现telnet功能示例
Apr 08 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
Jun 20 PHP
PHP中FTP相关函数小结
Jul 15 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
使用TensorFlow实现SVM
2018/09/06 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
和平主题的演讲稿
2014/01/12 职场文书
初婚初育证明
2014/01/14 职场文书
临床医师个人自我评价
2014/04/06 职场文书
消防安全标语
2014/06/07 职场文书
大学生个人求职信例文
2014/07/07 职场文书
防火标语大全
2014/10/06 职场文书
2014年生活老师工作总结
2014/12/23 职场文书
建党伟业观后感
2015/06/01 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
Go timer如何调度
2021/06/09 Golang
Python3的进程和线程你了解吗
2022/03/16 Python