| 
       
	TreeTable是一个能把无限分类展现为表格形式的PHP类库插件,分类的层级表示为表格的列,分类的行数表格分类的总数,单元格显示分类名称. 
	TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构. 
	1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据,代码如下: 
	
		- 
			array(  
 
		- 
			    *  1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),  
 
		- 
			    *  2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),  
 
		- 
			    *  3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),  
 
		- 
			    *  4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),  
 
		- 
			    *  5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),  
 
		- 
			    *  6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),  
 
		- 
			    *  7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')  
 
		- 
			    *  )  
 
	 
 
	2.导入TreeTable类库,代码如下: 
	
		- 
			import('@.ORG.Util.TableTree');  
 
		- 
			$treeTable->init($treearr); 
 
		- 
			echo $treeTable->get_treetable(); 
 
	 
 
	注意:get_treetable()只生产表体部门,<TALBE></TABLE>请自行构建. 
	php完整代码如下: 
	
		- 
			<?php 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			class TreeTable { 
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public $arr = array(); 
 
		- 
			 
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public $columns = 0; 
 
		- 
			 
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public $rows  = 0; 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public function init($arr=array()){ 
 
		- 
			        if(!is_array($arr)) return false; 
 
		- 
			         
 
		- 
			        foreach ($arr as $k=>$v) { 
 
		- 
			            $this->arr[$v['id']] = $v; 
 
		- 
			        } 
 
		- 
			         
 
		- 
			        foreach ($this->arr as $k => $v){ 
 
		- 
			            $this->arr[$k]['column']           = $this->get_level($v['id']);  
 
		- 
			            $this->arr[$k]['arrchildid']       = $this->get_arrchildid($v['id']);  
 
		- 
			            $this->arr[$k]['arrparentid']      = $this->get_arrparentid($v['id']);  
 
		- 
			            $this->arr[$k]['child_bottom_num'] = $this->get_child_count($v['id']);  
 
		- 
			        } 
 
		- 
			         
 
		- 
			          $this->columns = $this->get_columns();  
 
		- 
			        $this->rows    = $this->get_rows();  
 
		- 
			         
 
		- 
			            
 
		- 
			        $this->sort_arr(); 
 
		- 
			         
 
		- 
			        foreach ($this->arr as $k => $v){ 
 
		- 
			            $this->arr[$k]['row']     = $this->get_row_location($v['id']);     
 
		- 
			            $this->arr[$k]['rowspan'] = $v['child_bottom_num'];  
 
		- 
			            $this->arr[$k]['colspan'] = $v['child_bottom_num'] == 0 ? $this->columns - $v['column'] + 1 : 0;  
 
		- 
			        } 
 
		- 
			         
 
		- 
			        return $this->get_tree_arr(); 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_tree_arr(){ 
 
		- 
			        return is_array($this->arr) ? $this->arr : false; 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			    public function sort_arr(){ 
 
		- 
			         
 
		- 
			         
 
		- 
			        foreach ($this->arr as $k => $v){ 
 
		- 
			            $order_pid_arr[$k] = $v['arrparentid']; 
 
		- 
			            $order_iscost[] = $v['sort']; 
 
		- 
			            $order_id_arr[$k] = $v['id'];     
 
		- 
			        } 
 
		- 
			         
 
		- 
			         
 
		- 
			        array_multisort( 
 
		- 
			        $order_pid_arr, SORT_ASC, SORT_STRING,  
 
		- 
			        $order_iscost, SORT_DESC, SORT_NUMERIC,  
 
		- 
			        $order_id_arr, SORT_ASC, SORT_NUMERIC,  
 
		- 
			        $this->arr); 
 
		- 
			         
 
		- 
			         
 
		- 
			           for ($column = 1; $column <= $this->columns; $column++) { 
 
		- 
			               $row_level = 0; 
 
		- 
			               foreach ($this->arr as $key => $node){ 
 
		- 
			                   if ($node['column'] == $column){ 
 
		- 
			                       $row_level++; 
 
		- 
			                       $this->arr[$key]['column_level']  = $row_level; 
 
		- 
			                   } 
 
		- 
			               } 
 
		- 
			           } 
 
		- 
			            
 
		- 
			            
 
		- 
			        foreach ($this->arr as $k=>$v) { 
 
		- 
			            $arr[$v['id']] = $v; 
 
		- 
			        } 
 
		- 
			         
 
		- 
			        $this->arr = $arr; 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_parent($myid){ 
 
		- 
			        $newarr = array(); 
 
		- 
			        if(!isset($this->arr[$myid])) return false; 
 
		- 
			        $pid = $this->arr[$myid]['parentid']; 
 
		- 
			        $pid = $this->arr[$pid]['parentid']; 
 
		- 
			        if(is_array($this->arr)){ 
 
		- 
			            foreach($this->arr as $id => $a){ 
 
		- 
			                if($a['parentid'] == $pid) $newarr[$id] = $a; 
 
		- 
			            } 
 
		- 
			        } 
 
		- 
			        return $newarr; 
 
		- 
			    } 
 
		- 
			 
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_child($myid){ 
 
		- 
			        $a = $newarr = array(); 
 
		- 
			        if(is_array($this->arr)){ 
 
		- 
			            foreach($this->arr as $id => $a){ 
 
		- 
			                if($a['parentid'] == $myid) $newarr[$id] = $a; 
 
		- 
			            } 
 
		- 
			        } 
 
		- 
			        return $newarr ? $newarr : false; 
 
		- 
			    } 
 
		- 
			         
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_level($myid, $init = true){ 
 
		- 
			        static $level = 1; 
 
		- 
			        if($init) $level = 1; 
 
		- 
			        if ($this->arr[$myid]['parentid']) { 
 
		- 
			            $level++; 
 
		- 
			            $this->get_level($this->arr[$myid]['parentid'], false); 
 
		- 
			        } 
 
		- 
			        return $level; 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_child_count($myid, $init = true){ 
 
		- 
			        static $count = 0; 
 
		- 
			        if($init) $count = 0; 
 
		- 
			        if(!$this->get_child($myid) && $init) return 0; 
 
		- 
			        if($childarr = $this->get_child($myid)){ 
 
		- 
			            foreach ($childarr as $v){ 
 
		- 
			                $this->get_child_count($v['id'], false); 
 
		- 
			            } 
 
		- 
			        }else{ 
 
		- 
			            $count++; 
 
		- 
			        } 
 
		- 
			        return $count; 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_arrchildid($myid, $init = true) { 
 
		- 
			        static $childid; 
 
		- 
			        if($init) $childid = ''; 
 
		- 
			        if(!is_array($this->arr)) return false; 
 
		- 
			        foreach($this->arr as $id => $a){ 
 
		- 
			            if($a['parentid'] == $myid) { 
 
		- 
			                $childid = $childid ? $childid.','.$a['id'] : $a['id']; 
 
		- 
			                $this->get_arrchildid($a['id'], false); 
 
		- 
			            } 
 
		- 
			        } 
 
		- 
			        return $childid ; 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_arrparentid($id, $arrparentid = '') { 
 
		- 
			        if(!is_array($this->arr)) return false; 
 
		- 
			        $parentid = $this->arr[$id]['parentid']; 
 
		- 
			        if($parentid > 0) $arrparentid = $arrparentid ? $parentid.','.$arrparentid : $parentid; 
 
		- 
			        if($parentid) $arrparentid = $this->get_arrparentid($parentid, $arrparentid); 
 
		- 
			        return $arrparentid; 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_row_location($myid){ 
 
		- 
			           $nodearr = $this->arr; 
 
		- 
			            
 
		- 
			          foreach ($nodearr as $key => $node){ 
 
		- 
			              if($myid == $node['id']) { 
 
		- 
			                  $node_row_count = 0; 
 
		- 
			                $arrparentid = explode(',', $node['arrparentid']); 
 
		- 
			                 
 
		- 
			                foreach ($arrparentid as $pid){ 
 
		- 
			                    foreach ($nodearr as $node_row){ 
 
		- 
			                        if($node_row['column'] == $nodearr[$pid]['column'] && $nodearr[$pid]['column_level'] > $node_row['column_level'] && $node_row['child_bottom_num'] == 0){ 
 
		- 
			                            $node_row_count ++; 
 
		- 
			                        } 
 
		- 
			                    }     
 
		- 
			                } 
 
		- 
			                 
 
		- 
			                foreach ($nodearr as $node_row){ 
 
		- 
			                    if($node['column'] == $node_row['column'] && $node_row['column_level'] <  $node['column_level']){ 
 
		- 
			                        $node_row_count += $node_row['child_bottom_num'] ? $node_row['child_bottom_num'] : 1; 
 
		- 
			                    } 
 
		- 
			                } 
 
		- 
			                $node_row_count++; 
 
		- 
			                break; 
 
		- 
			            } 
 
		- 
			        } 
 
		- 
			        return $node_row_count;     
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_rows(){ 
 
		- 
			        $row = 0; 
 
		- 
			        foreach ($this->arr as $key => $node){ 
 
		- 
			            if($node['child_bottom_num'] == 0){ 
 
		- 
			                $rows++;  
 
		- 
			            } 
 
		- 
			        } 
 
		- 
			        return $rows; 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_columns(){ 
 
		- 
			        $columns = 0 ; 
 
		- 
			        foreach ($this->arr as $key => $node){ 
 
		- 
			            if($node['column'] > $columns){ 
 
		- 
			                $columns = $node['column'];  
 
		- 
			            } 
 
		- 
			        } 
 
		- 
			        return $columns; 
 
		- 
			    } 
 
		- 
			     
 
		- 
			     
 
		- 
			 
 
		- 
			 
 
		- 
			    public function get_treetable(){ 
 
		- 
			        $table_string = ''; 
 
		- 
			        for($row = 1; $row <= $this->rows; $row++){ 
 
		- 
			            $table_string .= "rt<tr>"; 
 
		- 
			            foreach ($this->arr as $v){ 
 
		- 
			                if($v['row'] == $row){ 
 
		- 
			                    $rowspan = $v['rowspan'] ? "rowspan='{$v['rowspan']}'" : ''; 
 
		- 
			                    $colspan = $v['colspan'] ? "colspan='{$v['colspan']}'" : ''; 
 
		- 
			                    $table_string .= "rtt<td {$rowspan} {$colspan}> 
 
		- 
			                    {$v['name']} 
 
		- 
			                    </td>"; 
 
		- 
			                } 
 
		- 
			            } 
 
		- 
			            $table_string .= "rt</tr>"; 
 
		- 
			        } 
 
		- 
			        return $table_string; 
 
		- 
			    } 
 
		- 
			} 
 
		- 
			?> 
 
		- 
			 
 
	 
 
      
      (责任编辑:最模板) |