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 相关文章推荐
如何实现给定日期的若干天以后的日期
Oct 09 PHP
php中的观察者模式
Mar 24 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
PHP设计模式 注册表模式
Feb 05 PHP
工厂模式在Zend Framework中应用介绍
Jul 10 PHP
PHP递归调用的小技巧讲解
Feb 19 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
php单例模式实现方法分析
Mar 14 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
Apr 07 PHP
PHP引用的调用方法分析
Apr 25 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP使用Session实现上传进度功能详解
Aug 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
一些星际专用术语解释
2020/03/04 星际争霸
用PHP+MySql编写聊天室
2006/10/09 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
简单通用的JS滑动门代码
2008/12/19 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
基于ajax和jsonp的原生封装(实例)
2017/10/16 Javascript
Vue中props的使用详解
2018/06/15 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python ldap实现登录实例代码
2016/09/30 Python
详解python3实现的web端json通信协议
2016/12/29 Python
pandas对指定列进行填充的方法
2018/04/11 Python
Python 忽略warning的输出方法
2018/10/18 Python
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
上海方立数码笔试题
2013/10/18 面试题
大学生求职简历的自我评价范文
2013/10/12 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
2014年消防工作实施方案
2014/02/20 职场文书
刑事代理授权委托书
2014/09/17 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
运动员入场词
2015/07/18 职场文书
礼仪培训心得体会
2016/01/22 职场文书