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

 更新时间:2020年04月04日 10:27:19   作者:未闻花名_zh  
这篇文章主要介绍了Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点,结合实例形式分析了thinkPHP递归遍历与数据查询、排序等相关操作技巧,需要的朋友可以参考下

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

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

相关文章

  • PHP将amr音频文件转换为mp3格式的操作细节

    PHP将amr音频文件转换为mp3格式的操作细节

    本文以centos服务器安装ffmpeg为例,给大家详细介绍PHP将amr音频文件转换为mp3格式的操作细节,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • Thinkphp5+Redis实现商品秒杀代码实例讲解

    Thinkphp5+Redis实现商品秒杀代码实例讲解

    这篇文章主要介绍了Thinkphp5+Redis实现商品秒杀代码实例讲解,代码和步骤讲解的很清楚,有需要的同学可以借鉴参考下
    2020-12-12
  • PHP单文件和多文件上传实例

    PHP单文件和多文件上传实例

    本篇文章给大家详细分析了PHP实现单文件上传和多文件上传的代码以及问题解决方案,一起学习参考下。
    2017-12-12
  • PHP手机短信验证码实现流程详解

    PHP手机短信验证码实现流程详解

    这篇文章主要为大家详细介绍了PHP手机短信验证码的实现流程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • CodeIgniter常用知识点小结

    CodeIgniter常用知识点小结

    这篇文章主要介绍了CodeIgniter常用知识点,包括跳转、常量定义、语言设置及支持get方法传参等技巧,需要的朋友可以参考下
    2016-05-05
  • 基于php伪静态的实现详细介绍

    基于php伪静态的实现详细介绍

    本篇文章介绍了,基于php伪静态的实现详细分析。需要的朋友参考下
    2013-04-04
  • Symfony查询方法实例小结

    Symfony查询方法实例小结

    这篇文章主要介绍了Symfony查询方法,结合实例形式总结分析了createQuery与getQuery查询数据的具体使用技巧,需要的朋友可以参考下
    2017-06-06
  • php实现的mongodb操作类

    php实现的mongodb操作类

    说到php连mongoDB,不得不先介绍一下php的官方手册,网址在:http://us.php.net/manual/en/book.mongo.php,接下来给大家分享一个本人常用的MONGODB的操作类,详见的数据库操作都有了,小伙伴可以参考下。
    2015-05-05
  • ThinkPHP打水印及设置水印位置的方法

    ThinkPHP打水印及设置水印位置的方法

    这篇文章主要介绍了ThinkPHP打水印及设置水印位置的方法,结合实例形式分析了thinkPHP打印与设置水印的相关操作步骤与具体实现技巧,需要的朋友可以参考下
    2016-10-10
  • laravel中数据显示方法(默认值和下拉option默认选中)

    laravel中数据显示方法(默认值和下拉option默认选中)

    今天小编就为大家分享一篇laravel中数据显示方法(默认值和下拉option默认选中),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10

最新评论