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 number_format() 函数定义和用法
Jun 01 PHP
phpword插件导出word文件时中文乱码问题处理方案
Aug 19 PHP
Linux下PHP连接Oracle数据库
Aug 20 PHP
php实现TCP端口检测的方法
Apr 01 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
PHP简单实现数字分页功能示例
Aug 24 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
Oct 17 PHP
php 二维数组时间排序实现代码
Nov 19 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
May 15 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
PHP多维数组排序array详解
Nov 21 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
input按钮的事件处理大全
2010/12/10 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
学习使用grunt来打包JavaScript和CSS程序的教程
2016/01/04 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
关于element的表单组件整理笔记
2021/02/05 Javascript
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
人机交互程序 python实现人机对话
2017/11/14 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
Python调用JavaScript代码的方法
2020/10/27 Python
使用CSS3的背景渐变Text Gradient 创建文字颜色渐变
2014/08/19 HTML / CSS
日语专业个人的求职信
2013/12/03 职场文书
空乘英文求职信
2014/04/13 职场文书
《得道多助,失道寡助》教学反思
2014/04/19 职场文书
安全横幅标语
2014/06/09 职场文书
无私奉献演讲稿
2014/09/04 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
2014年班组工作总结
2014/11/20 职场文书
玄武湖导游词
2015/02/05 职场文书