当前位置:首页 > CMS教程 > Thinkphp > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-24 08:27:22 浏览: 评论:0 

本文实例讲述了Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点,分享给大家供大家参考,具体如下:

list_to_tree 使用起来十分方便,详细可查看手册,因为我在用的时候需要同时列出所有节点,所以写了一个递归函数,拿出来供大家参考。

  1. public function index(){ 
  2.   Load('extend');      //加载扩展方法 
  3.   $Category=D('Category'); 
  4.   $list=$Category->order('sort desc')->select();//实现同级节点排序 
  5.   $list=list_to_tree($list,'id','fid'); //详细参数见手册 
  6.   $list=$this->findChild($list); 
  7.   dump($list); 
  8. } 
  9. protected function findChild($arr){ 
  10.     static $tree=array(); 
  11.     foreach ($arr as $key=>$val){ 
  12.         $tree[]=$val; 
  13.         if (isset($val['_child'])){ 
  14.           $this->findChild($val['_child']); 
  15.         } 
  16.       } 
  17.   return $tree; 
  18. } 
  19.  
  20. /** 
  21.  * 把返回的数据集转换成Tree 
  22.  * @access public 
  23.  * @param array $list 要转换的数据集 
  24.  * @param string $pid parent标记字段 
  25.  * @param string $level level标记字段 
  26.  * @return array 
  27.  */ 
  28. function list_to_tree($list, $pk='id',$pid = 'pid',$child = '_child',$root=0) { 
  29.   // 创建Tree 
  30.   $tree = array(); 
  31.   if(is_array($list)) { 
  32.     // 创建基于主键的数组引用 
  33.     $refer = array(); 
  34.     foreach ($list as $key => $data) { 
  35.       $refer[$data[$pk]] =& $list[$key]; 
  36.     } 
  37.     foreach ($list as $key => $data) { 
  38.       // 判断是否存在parent 
  39.       $parentId = $data[$pid]; 
  40.       if ($root == $parentId) { 
  41.         $tree[] =& $list[$key]; 
  42.       }else{ 
  43.         if (isset($refer[$parentId])) { 
  44.           $parent =& $refer[$parentId]; 
  45.           $parent[$child][] =& $list[$key]; 
  46.         } 
  47.       } 
  48.     } 
  49.   } 
  50.   return $tree; 
  51. } 
  52.  
  53. /** 
  54.  * 对查询结果集进行排序 
  55.  * @access public 
  56.  * @param array $list 查询结果 
  57.  * @param string $field 排序的字段名 
  58.  * @param array $sortby 排序类型 
  59.  * asc正向排序 desc逆向排序 nat自然排序 
  60.  * @return array 
  61.  */ 
  62. function list_sort_by($list,$field, $sortby='asc') { 
  63.   if(is_array($list)){ 
  64.     $refer = $resultSet = array(); 
  65.     foreach ($list as $i => $data) 
  66.       $refer[$i] = &$data[$field]; 
  67.     switch ($sortby) { 
  68.       case 'asc': // 正向排序 
  69.         asort($refer); 
  70.         break; 
  71.       case 'desc':// 逆向排序 
  72.         arsort($refer); 
  73.         break; 
  74.       case 'nat': // 自然排序 
  75.         natcasesort($refer); 
  76.         break; 
  77.     } 
  78.     foreach ( $refer as $key=> $val) 
  79.       $resultSet[] = &$list[$key]; 
  80.     return $resultSet; 
  81.   } 
  82.   return false; 
  83. } 
  84.  
  85. /** 
  86.  * 在数据列表中搜索 
  87.  * @access public 
  88.  * @param array $list 数据列表 
  89.  * @param mixed $condition 查询条件 
  90.  * 支持 array('name'=>$value) 或者 name=$value 
  91.  * @return array 
  92.  */ 
  93. function list_search($list,$condition) { 
  94.   if(is_string($condition)) 
  95.     parse_str($condition,$condition); 
  96.   // 返回的结果集合 
  97.   $resultSet = array(); 
  98.   foreach ($list as $key=>$data){ 
  99.     $find  =  false; 
  100.     foreach ($condition as $field=>$value){ 
  101.       if(isset($data[$field])) { 
  102.         if(0 === strpos($value,'/')) { 
  103.           $find  =  preg_match($value,$data[$field]); 
  104.         }elseif($data[$field]==$value){ 
  105.           $find = true; 
  106.         } 
  107.       } 
  108.     } 
  109.     if($find) 
  110.       $resultSet[]   =  &$list[$key]; 
  111.   } 
  112.   return $resultSet; 
  113. }

Tags: list_to_tree Thinkphp无限级

分享到: