网站地图    收藏   

主页 > php专栏 > php应用 >

PHP版表格展示无限级分类 - php高级应用

来源:自学PHP网    时间:2014-11-27 22:16 作者: 阅读:

[导读] TreeTable是一个能把无限分类展现为表格形式的PHP类库插件,分类的层级表示为表格的列,分类的行数表格分类的总数,单元格显示分类名称.TreeTable通过对单元格的行合并和列合并实现了无限...

PHP版表格展示无限级分类

TreeTable是一个能把无限分类展现为表格形式的PHP类库插件,分类的层级表示为表格的列,分类的行数表格分类的总数,单元格显示分类名称.

TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构.

1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据,代码如下:

  1. array(  
  2.     *  1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),  
  3.     *  2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),  
  4.     *  3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),  
  5.     *  4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),  
  6.     *  5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),  
  7.     *  6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),  
  8.     *  7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')  
  9.     *  )  

2.导入TreeTable类库,代码如下:

  1. import('@.ORG.Util.TableTree'); //Thinkphp导入方法3. 生成TreeTable HTML代码 
  2. $treeTable->init($treearr); 
  3. echo $treeTable->get_treetable(); 

注意:get_treetable()只生产表体部门,<TALBE></TABLE>请自行构建.

php完整代码如下:

  1. <?php 
  2. /** 
  3.  * File name: TreeTable.class.php 
  4.  * Author: run.gao 312854458@qq.com  Date: 2012-07-24 23:22 GMT+8 
  5.  * Description: 通用的表格无限级分类 
  6.  * */ 
  7.  
  8. /** 
  9.  * 表格展示无限分类是将无线分类已表格的形式表现出来,更好的能体现出分类的所属关系 
  10.  * 使用方法: 
  11.  * 1. 实例化分类 
  12.  * $treeTable = new TreeTable(); 
  13.  * 2. 初始化分类,$treearr必须是一个多维数组且包含 id,parentid,name字段 
  14.  * $treeTable->init($treearr); 
  15.  * 3. 获取无限分类HTML代码 
  16.  * echo $treeTable->get_treetable(); 
  17.  * */ 
  18.  
  19. class TreeTable { 
  20.     /** 
  21.     * 生成树型结构所需要的2维数组 
  22.     * @var array 
  23.     */ 
  24.     public $arr = array(); 
  25.  
  26.     /** 
  27.      * 表格列数 
  28.      * @var int 
  29.      */ 
  30.     public $columns = 0; 
  31.  
  32.     /** 
  33.      * 表格行数 
  34.      * @var int 
  35.      */ 
  36.     public $rows  = 0; 
  37.      
  38.     /** 
  39.     * 初始化TreeTable数据 
  40.     * @param array 2维数组 
  41.     * array( 
  42.     *      1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'), 
  43.     *      2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'), 
  44.     *      3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'), 
  45.     *      4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'), 
  46.     *      5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'), 
  47.     *      6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'), 
  48.     *      7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二') 
  49.     *      ) 
  50.     */ 
  51.     public function init($arr=array()){ 
  52.         if(!is_array($arr)) return false; 
  53.          
  54.         foreach ($arr as $k=>$v) { 
  55.             $this->arr[$v['id']] = $v
  56.         } 
  57.          
  58.         foreach ($this->arr as $k => $v){ 
  59.             $this->arr[$k]['column']           = $this->get_level($v['id']); // Y轴位置 
  60.             $this->arr[$k]['arrchildid']       = $this->get_arrchildid($v['id']); // 所有子节点 
  61.             $this->arr[$k]['arrparentid']      = $this->get_arrparentid($v['id']); // 所有父节点 
  62.             $this->arr[$k]['child_bottom_num'] = $this->get_child_count($v['id']); // 所有底层元素节点 
  63.         } 
  64.          
  65.           $this->columns = $this->get_columns(); // 总行数 
  66.         $this->rows    = $this->get_rows(); // 总列数 
  67.          
  68.            // 按照arrparentid和id号进行排序 
  69.         $this->sort_arr(); 
  70.          
  71.         foreach ($this->arr as $k => $v){ 
  72.             $this->arr[$k]['row']     = $this->get_row_location($v['id']);    // X轴位置 
  73.             $this->arr[$k]['rowspan'] = $v['child_bottom_num']; // 行合并数    
  74.             $this->arr[$k]['colspan'] = $v['child_bottom_num'] == 0 ? $this->columns - $v['column'] + 1 : 0; //列合并数 
  75.         } 
  76.          
  77.         return $this->get_tree_arr(); 
  78.     } 
  79.      
  80.     /** 
  81.      * 获取数组 
  82.      * */ 
  83.     public function get_tree_arr(){ 
  84.         return is_array($this->arr) ? $this->arr : false; 
  85.     } 
  86.      
  87.     /** 
  88.      * 按arrparentid/id号依次重新排序数组 
  89.      * */ 
  90.     public function sort_arr(){ 
  91.          
  92.         // 要进行排序的字段 
  93.         foreach ($this->arr as $k => $v){ 
  94.             $order_pid_arr[$k] = $v['arrparentid']; 
  95.             $order_iscost[] = $v['sort']; 
  96.             $order_id_arr[$k] = $v['id'];     
  97.         } 
  98.          
  99.         // 先根据arrparentid排序,再根据排序,id号排序 
  100.         array_multisort
  101.         $order_pid_arr, SORT_ASC, SORT_STRING,  
  102.         $order_iscost, SORT_DESC, SORT_NUMERIC,  
  103.         $order_id_arr, SORT_ASC, SORT_NUMERIC,  
  104.         $this->arr); 
  105.          
  106.         // 获取每一个节点层次 
  107.            for ($column = 1; $column <= $this->columns; $column++) { 
  108.                $row_level = 0; 
  109.                foreach ($this->arr as $key => $node){ 
  110.                    if ($node['column'] == $column){ 
  111.                        $row_level++; 
  112.                        $this->arr[$key]['column_level']  = $row_level
  113.                    } 
  114.                } 
  115.            } 
  116.             
  117.            // 重新计算以ID作为键名 
  118.         foreach ($this->arr as $k=>$v) { 
  119.             $arr[$v['id']] = $v
  120.         } 
  121.          
  122.         $this->arr = $arr
  123.     } 
  124.      
  125.     /** 
  126.     * 得到父级数组 
  127.     * @param int 
  128.     * @return array 
  129.     */ 
  130.     public function get_parent($myid){ 
  131.         $newarr = array(); 
  132.         if(!isset($this->arr[$myid])) return false; 
  133.         $pid = $this->arr[$myid]['parentid']; 
  134.         $pid = $this->arr[$pid]['parentid']; 
  135.         if(is_array($this->arr)){ 
  136.             foreach($this->arr as $id => $a){ 
  137.                 if($a['parentid'] == $pid$newarr[$id] = $a
  138.             } 
  139.         } 
  140.         return $newarr
  141.     } 
  142.  
  143.     /** 
  144.     * 得到子级数组 
  145.     * @param int 
  146.     * @return array 
  147.     */ 
  148.     public function get_child($myid){ 
  149.         $a = $newarr = array(); 
  150.         if(is_array($this->arr)){ 
  151.             foreach($this->arr as $id => $a){ 
  152.                 if($a['parentid'] == $myid$newarr[$id] = $a
  153.             } 
  154.         } 
  155.         return $newarr ? $newarr : false; 
  156.     } 
  157.          
  158.     /** 
  159.      * 获取当前节点所在的层级 
  160.      * @param $myid 当前节点ID号 
  161.      * */ 
  162.     public function get_level($myid$init = true){ 
  163.         static $level = 1; 
  164.         if($init$level = 1; 
  165.         if ($this->arr[$myid]['parentid']) { 
  166.             $level++; 
  167.             $this->get_level($this->arr[$myid]['parentid'], false); 
  168.         } 
  169.         return $level
  170.     } 
  171.      
  172.     /** 
  173.      * 获取当前节点所有底层节点(没有子节点的节点)的数量 
  174.      * @param $myid 节点ID号 
  175.      * @param $init 第一次加载将情况static变量 
  176.      * */ 
  177.     public function get_child_count($myid$init = true){ 
  178.         static $count = 0; 
  179.         if($init$count = 0; 
  180.         if(!$this->get_child($myid) && $initreturn 0; 
  181.         if($childarr = $this->get_child($myid)){ 
  182.             foreach ($childarr as $v){ 
  183.                 $this->get_child_count($v['id'], false); 
  184.             } 
  185.         }else
  186.             $count++; 
  187.         } 
  188.         return $count
  189.     } 
  190.      
  191.     /** 
  192.      * 获取节点所有子节点ID号 
  193.      * @param $catid 节点ID号 
  194.      * @param $init 第一次加载将情况static初始化 
  195.      * */ 
  196.     public function get_arrchildid($myid$init = true) { 
  197.         static $childid
  198.         if($init$childid = ''
  199.         if(!is_array($this->arr)) return false; 
  200.         foreach($this->arr as $id => $a){ 
  201.             if($a['parentid'] == $myid) { 
  202.                 $childid = $childid ? $childid.','.$a['id'] : $a['id']; 
  203.                 $this->get_arrchildid($a['id'], false); 
  204.             } 
  205.         } 
  206.         return $childid ; 
  207.     } 
  208.      
  209.     /** 
  210.      * 获取该节点所有父节点ID号 
  211.      * @param $id 节点ID号 
  212.      * */ 
  213.     public function get_arrparentid($id$arrparentid = '') { 
  214.         if(!is_array($this->arr)) return false; 
  215.         $parentid = $this->arr[$id]['parentid']; 
  216.         if($parentid > 0) $arrparentid = $arrparentid ? $parentid.','.$arrparentid : $parentid
  217.         if($parentid$arrparentid = $this->get_arrparentid($parentid$arrparentid); 
  218.         return $arrparentid
  219.     } 
  220.      
  221.     /** 
  222.      * 获取节点所在地行定位 
  223.      * @param $myid 节点ID号 
  224.      */ 
  225.     public function get_row_location($myid){ 
  226.            $nodearr = $this->arr; 
  227.            // 获取每一个节点所在行的位置 
  228.           foreach ($nodearr as $key => $node){ 
  229.               if($myid == $node['id']) { 
  230.                   $node_row_count = 0; 
  231.                 $arrparentid = explode(','$node['arrparentid']); 
  232.                 // 所有父节点小于当前节点层次的底层节点等于0的元素 
  233.                 foreach ($arrparentid as $pid){ 
  234.                     foreach ($nodearr as $node_row){ 
  235.                         if($node_row['column'] == $nodearr[$pid]['column'] && $nodearr[$pid]['column_level'] > $node_row['column_level'] && $node_row['child_bottom_num'] == 0){ 
  236.                             $node_row_count ++; 
  237.                         } 
  238.                     }     
  239.                 } 
  240.                 // 所有当前节点并且节点层次(rowid_level)小于当前节点层次的个数 
  241.                 foreach ($nodearr as $node_row){ 
  242.                     if($node['column'] == $node_row['column'] && $node_row['column_level'] <  $node['column_level']){ 
  243.                         $node_row_count += $node_row['child_bottom_num'] ? $node_row['child_bottom_num'] : 1; 
  244.                     } 
  245.                 } 
  246.                 $node_row_count++; 
  247.                 break
  248.             } 
  249.         } 
  250.         return $node_row_count;     
  251.     } 
  252.      
  253.     /** 
  254.      * 获取表格的行数 
  255.      * */ 
  256.     public function get_rows(){ 
  257.         $row = 0; 
  258.         foreach ($this->arr as $key => $node){ 
  259.             if($node['child_bottom_num'] == 0){ 
  260.                 $rows++; // 总行数 
  261.             } 
  262.         } 
  263.         return $rows
  264.     } 
  265.      
  266.     /** 
  267.      * 获取表格的列数 
  268.      * */ 
  269.     public function get_columns(){ 
  270.         $columns = 0 ; 
  271.         foreach ($this->arr as $key => $node){ 
  272.             if($node['column'] > $columns){ 
  273.                 $columns = $node['column']; // 总列数 
  274.             } 
  275.         } 
  276.         return $columns
  277.     } 
  278.      
  279.     /** 
  280.      * 获取分类的表格展现形式(不包含表头) 
  281.      * */ 
  282.     public function get_treetable(){ 
  283.         $table_string = ''
  284.         for($row = 1; $row <= $this->rows; $row++){ 
  285.             $table_string .= "rt<tr>"
  286.             foreach ($this->arr as $v){ 
  287.                 if($v['row'] == $row){ 
  288.                     $rowspan = $v['rowspan'] ? "rowspan='{$v['rowspan']}'" : ''
  289.                     $colspan = $v['colspan'] ? "colspan='{$v['colspan']}'" : ''
  290.                     $table_string .= "rtt<td {$rowspan} {$colspan}> 
  291.                     {$v['name']} 
  292.                     </td>"; 
  293.                 } 
  294.             } 
  295.             $table_string .= "rt</tr>"
  296.         }//开源代码phpfensi.com 
  297.         return $table_string
  298.     } 
  299. ?> 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论