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模板之Phpbean的目录结构
Jan 10 PHP
php 正则匹配函数体
Aug 25 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
PHP的变量类型和作用域详解
Mar 12 PHP
php数组键值用法实例分析
Feb 27 PHP
Yii控制器中filter过滤器用法分析
Jul 15 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
php求斐波那契数的两种实现方式【递归与递推】
Sep 09 PHP
Laravel框架控制器的middleware中间件用法分析
Sep 30 PHP
Thinkphp5.0框架视图view的循环标签用法示例
Oct 12 PHP
php提高脚本性能的4个技巧
Aug 18 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常用函数的使用汇总
2013/06/08 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
phplot生成图片类用法详解
2015/01/06 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
vue组件实例解析
2017/01/10 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
vue中@change兼容问题详解
2019/10/25 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
[57:59]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第一场 11.05
2020/11/05 DOTA
python中实现定制类的特殊方法总结
2014/09/28 Python
深入理解Python中变量赋值的问题
2017/01/12 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
python实现淘宝购物系统
2019/10/25 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
python开发入门——列表生成式
2020/09/03 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
英国女装网上商店:I Saw It First
2018/10/18 全球购物
《识字五》教学反思
2014/03/01 职场文书
新学期开学标语
2014/06/30 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
2014年村官工作总结
2014/11/24 职场文书
谢师宴家长致辞
2015/07/27 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis