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 和 MySQL 基础教程(四)
Oct 09 PHP
40个迹象表明你还是PHP菜鸟
Sep 29 PHP
php通用防注入程序 推荐
Feb 26 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
Jan 11 PHP
Youku 视频绝对地址获取的方法详解
Jun 26 PHP
php获取301跳转URL简单实例
Dec 16 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 PHP
php实现微信分享朋友链接功能
Feb 18 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
2009/08/07 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
jQuery实现根据生日计算年龄 星座 生肖
2016/11/23 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
详解vue 数据传递的方法
2018/04/19 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
网络工程专业毕业生推荐信
2013/10/28 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
村抢险救灾方案
2014/05/09 职场文书
奠基仪式策划方案
2014/05/15 职场文书
银行求职信范文
2014/05/26 职场文书
学前教育专业求职信
2014/09/02 职场文书
2014年后勤工作总结
2014/11/18 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书