国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > PHP > 正文

PHP版表格展示無限級(jí)分類

2024-05-04 21:48:41
字體:
供稿:網(wǎng)友

TreeTable是一個(gè)能把無限分類展現(xiàn)為表格形式的PHP類庫(kù)插件,分類的層級(jí)表示為表格的列,分類的行數(shù)表格分類的總數(shù),單元格顯示分類名稱.

TreeTable通過對(duì)單元格的行合并和列合并實(shí)現(xiàn)了無限層級(jí)也能較好的展示層級(jí)架構(gòu).

1.構(gòu)建ID/PID/NAME的數(shù)組,后期可通過數(shù)據(jù)庫(kù)生成的動(dòng)態(tài)數(shù)據(jù),代碼如下:

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

2.導(dǎo)入TreeTable類庫(kù),代碼如下:

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

注意:get_treetable()只生產(chǎn)表體部門,<TALBE></TABLE>請(qǐng)自行構(gòu)建.

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: 通用的表格無限級(jí)分類 
  6.  * */ 
  7.  
  8. /** 
  9.  * 表格展示無限分類是將無線分類已表格的形式表現(xiàn)出來,更好的能體現(xiàn)出分類的所屬關(guān)系 
  10.  * 使用方法: 
  11.  * 1. 實(shí)例化分類 
  12.  * $treeTable = new TreeTable(); 
  13.  * 2. 初始化分類,$treearr必須是一個(gè)多維數(shù)組且包含 id,parentid,name字段 
  14.  * $treeTable->init($treearr); 
  15.  * 3. 獲取無限分類HTML代碼 
  16.  * echo $treeTable->get_treetable(); 
  17.  * */ 
  18.  
  19. class TreeTable { 
  20.     /** 
  21.     * 生成樹型結(jié)構(gòu)所需要的2維數(shù)組 
  22.     * @var array 
  23.     */ 
  24.     public $arr = array(); 
  25.  
  26.     /** 
  27.      * 表格列數(shù) 
  28.      * @var int 
  29.      */ 
  30.     public $columns = 0; 
  31.  
  32.     /** 
  33.      * 表格行數(shù) 
  34.      * @var int 
  35.      */ 
  36.     public $rows  = 0; 
  37.      
  38.     /** 
  39.     * 初始化TreeTable數(shù)據(jù) 
  40.     * @param array 2維數(shù)組 
  41.     * array( 
  42.     *      1 => array('id'=>'1','parentid'=>0,'name'=>'一級(jí)欄目一'), 
  43.     *      2 => array('id'=>'2','parentid'=>0,'name'=>'一級(jí)欄目二'), 
  44.     *      3 => array('id'=>'3','parentid'=>1,'name'=>'二級(jí)欄目一'), 
  45.     *      4 => array('id'=>'4','parentid'=>1,'name'=>'二級(jí)欄目二'), 
  46.     *      5 => array('id'=>'5','parentid'=>2,'name'=>'二級(jí)欄目三'), 
  47.     *      6 => array('id'=>'6','parentid'=>3,'name'=>'三級(jí)欄目一'), 
  48.     *      7 => array('id'=>'7','parentid'=>3,'name'=>'三級(jí)欄目二') 
  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']); // 所有子節(jié)點(diǎn) 
  61.             $this->arr[$k]['arrparentid']      = $this->get_arrparentid($v['id']); // 所有父節(jié)點(diǎn) 
  62.             $this->arr[$k]['child_bottom_num'] = $this->get_child_count($v['id']); // 所有底層元素節(jié)點(diǎn) 
  63.         } 
  64.          
  65.           $this->columns = $this->get_columns(); // 總行數(shù) 
  66.         $this->rows    = $this->get_rows(); // 總列數(shù) 
  67.          
  68.            // 按照arrparentid和id號(hào)進(jìn)行排序 
  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']; // 行合并數(shù)    
  74.             $this->arr[$k]['colspan'] = $v['child_bottom_num'] == 0 ? $this->columns - $v['column'] + 1 : 0; //列合并數(shù) 
  75.         } 
  76.          
  77.         return $this->get_tree_arr(); 
  78.     } 
  79.      
  80.     /** 
  81.      * 獲取數(shù)組 
  82.      * */ 
  83.     public function get_tree_arr(){ 
  84.         return is_array($this->arr) ? $this->arr : false; 
  85.     } 
  86.      
  87.     /** 
  88.      * 按arrparentid/id號(hào)依次重新排序數(shù)組 
  89.      * */ 
  90.     public function sort_arr(){ 
  91.          
  92.         // 要進(jìn)行排序的字段 
  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.         // 先根據(jù)arrparentid排序,再根據(jù)排序,id號(hào)排序 
  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.         // 獲取每一個(gè)節(jié)點(diǎn)層次 
  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.            // 重新計(jì)算以ID作為鍵名 
  118.         foreach ($this->arr as $k=>$v) { 
  119.             $arr[$v['id']] = $v
  120.         } 
  121.          
  122.         $this->arr = $arr
  123.     } 
  124.      
  125.     /** 
  126.     * 得到父級(jí)數(shù)組 
  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.     * 得到子級(jí)數(shù)組 
  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.      * 獲取當(dāng)前節(jié)點(diǎn)所在的層級(jí) 
  160.      * @param $myid 當(dāng)前節(jié)點(diǎn)ID號(hào) 
  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.      * 獲取當(dāng)前節(jié)點(diǎn)所有底層節(jié)點(diǎn)(沒有子節(jié)點(diǎn)的節(jié)點(diǎn))的數(shù)量 
  174.      * @param $myid 節(jié)點(diǎn)ID號(hào) 
  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.      * 獲取節(jié)點(diǎn)所有子節(jié)點(diǎn)ID號(hào) 
  193.      * @param $catid 節(jié)點(diǎn)ID號(hào) 
  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.      * 獲取該節(jié)點(diǎn)所有父節(jié)點(diǎn)ID號(hào) 
  211.      * @param $id 節(jié)點(diǎn)ID號(hào) 
  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.      * 獲取節(jié)點(diǎn)所在地行定位 
  223.      * @param $myid 節(jié)點(diǎn)ID號(hào) 
  224.      */ 
  225.     public function get_row_location($myid){ 
  226.            $nodearr = $this->arr; 
  227.            // 獲取每一個(gè)節(jié)點(diǎn)所在行的位置 
  228.           foreach ($nodearr as $key => $node){ 
  229.               if($myid == $node['id']) { 
  230.                   $node_row_count = 0; 
  231.                 $arrparentid = explode(','$node['arrparentid']); 
  232.                 // 所有父節(jié)點(diǎn)小于當(dāng)前節(jié)點(diǎn)層次的底層節(jié)點(diǎn)等于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.                 // 所有當(dāng)前節(jié)點(diǎn)并且節(jié)點(diǎn)層次(rowid_level)小于當(dāng)前節(jié)點(diǎn)層次的個(gè)數(shù) 
  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.      * 獲取表格的行數(shù) 
  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++; // 總行數(shù) 
  261.             } 
  262.         } 
  263.         return $rows
  264.     } 
  265.      
  266.     /** 
  267.      * 獲取表格的列數(shù) 
  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']; // 總列數(shù) 
  274.             } 
  275.         } 
  276.         return $columns
  277.     } 
  278.      
  279.     /** 
  280.      * 獲取分類的表格展現(xiàn)形式(不包含表頭) 
  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.         }//開源代碼Vevb.com 
  297.         return $table_string
  298.     } 
  299. ?> 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 五家渠市| 鄂尔多斯市| 攀枝花市| 正蓝旗| 乐东| 遂溪县| 郁南县| 公安县| 五河县| 邵武市| 陕西省| 屏边| 安庆市| 呼和浩特市| 冷水江市| 安岳县| 咸阳市| 彭阳县| 浦县| 汤阴县| 博野县| 衡阳市| 呼玛县| 桃江县| 武定县| 玉树县| 襄汾县| 沂源县| 伊金霍洛旗| 巢湖市| 大城县| 土默特右旗| 调兵山市| 寿宁县| 稻城县| 肥东县| 宣城市| 铜川市| 贵南县| 伊金霍洛旗| 闸北区|