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ù),代碼如下:
- array(
- * 1 => array('id'=>'1','parentid'=>0,'name'=>'一級(jí)欄目一'),
- * 2 => array('id'=>'2','parentid'=>0,'name'=>'一級(jí)欄目二'),
- * 3 => array('id'=>'3','parentid'=>1,'name'=>'二級(jí)欄目一'),
- * 4 => array('id'=>'4','parentid'=>1,'name'=>'二級(jí)欄目二'),
- * 5 => array('id'=>'5','parentid'=>2,'name'=>'二級(jí)欄目三'),
- * 6 => array('id'=>'6','parentid'=>3,'name'=>'三級(jí)欄目一'),
- * 7 => array('id'=>'7','parentid'=>3,'name'=>'三級(jí)欄目二')
- * )
2.導(dǎo)入TreeTable類庫(kù),代碼如下:
- import('@.ORG.Util.TableTree'); //Thinkphp導(dǎo)入方法3. 生成TreeTable HTML代碼
- $treeTable->init($treearr);
- echo $treeTable->get_treetable();
注意:get_treetable()只生產(chǎn)表體部門,<TALBE></TABLE>請(qǐng)自行構(gòu)建.
php完整代碼如下:
- <?php
- /**
- * File name: TreeTable.class.php
- * Author: run.gao 312854458@qq.com Date: 2012-07-24 23:22 GMT+8
- * Description: 通用的表格無限級(jí)分類
- * */
- /**
- * 表格展示無限分類是將無線分類已表格的形式表現(xiàn)出來,更好的能體現(xiàn)出分類的所屬關(guān)系
- * 使用方法:
- * 1. 實(shí)例化分類
- * $treeTable = new TreeTable();
- * 2. 初始化分類,$treearr必須是一個(gè)多維數(shù)組且包含 id,parentid,name字段
- * $treeTable->init($treearr);
- * 3. 獲取無限分類HTML代碼
- * echo $treeTable->get_treetable();
- * */
- class TreeTable {
- /**
- * 生成樹型結(jié)構(gòu)所需要的2維數(shù)組
- * @var array
- */
- public $arr = array();
- /**
- * 表格列數(shù)
- * @var int
- */
- public $columns = 0;
- /**
- * 表格行數(shù)
- * @var int
- */
- public $rows = 0;
- /**
- * 初始化TreeTable數(shù)據(jù)
- * @param array 2維數(shù)組
- * array(
- * 1 => array('id'=>'1','parentid'=>0,'name'=>'一級(jí)欄目一'),
- * 2 => array('id'=>'2','parentid'=>0,'name'=>'一級(jí)欄目二'),
- * 3 => array('id'=>'3','parentid'=>1,'name'=>'二級(jí)欄目一'),
- * 4 => array('id'=>'4','parentid'=>1,'name'=>'二級(jí)欄目二'),
- * 5 => array('id'=>'5','parentid'=>2,'name'=>'二級(jí)欄目三'),
- * 6 => array('id'=>'6','parentid'=>3,'name'=>'三級(jí)欄目一'),
- * 7 => array('id'=>'7','parentid'=>3,'name'=>'三級(jí)欄目二')
- * )
- */
- 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']); // Y軸位置
- $this->arr[$k]['arrchildid'] = $this->get_arrchildid($v['id']); // 所有子節(jié)點(diǎn)
- $this->arr[$k]['arrparentid'] = $this->get_arrparentid($v['id']); // 所有父節(jié)點(diǎn)
- $this->arr[$k]['child_bottom_num'] = $this->get_child_count($v['id']); // 所有底層元素節(jié)點(diǎn)
- }
- $this->columns = $this->get_columns(); // 總行數(shù)
- $this->rows = $this->get_rows(); // 總列數(shù)
- // 按照arrparentid和id號(hào)進(jìn)行排序
- $this->sort_arr();
- foreach ($this->arr as $k => $v){
- $this->arr[$k]['row'] = $this->get_row_location($v['id']); // X軸位置
- $this->arr[$k]['rowspan'] = $v['child_bottom_num']; // 行合并數(shù)
- $this->arr[$k]['colspan'] = $v['child_bottom_num'] == 0 ? $this->columns - $v['column'] + 1 : 0; //列合并數(shù)
- }
- return $this->get_tree_arr();
- }
- /**
- * 獲取數(shù)組
- * */
- public function get_tree_arr(){
- return is_array($this->arr) ? $this->arr : false;
- }
- /**
- * 按arrparentid/id號(hào)依次重新排序數(shù)組
- * */
- public function sort_arr(){
- // 要進(jìn)行排序的字段
- foreach ($this->arr as $k => $v){
- $order_pid_arr[$k] = $v['arrparentid'];
- $order_iscost[] = $v['sort'];
- $order_id_arr[$k] = $v['id'];
- }
- // 先根據(jù)arrparentid排序,再根據(jù)排序,id號(hào)排序
- array_multisort(
- $order_pid_arr, SORT_ASC, SORT_STRING,
- $order_iscost, SORT_DESC, SORT_NUMERIC,
- $order_id_arr, SORT_ASC, SORT_NUMERIC,
- $this->arr);
- // 獲取每一個(gè)節(jié)點(diǎn)層次
- 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;
- }
- }
- }
- // 重新計(jì)算以ID作為鍵名
- foreach ($this->arr as $k=>$v) {
- $arr[$v['id']] = $v;
- }
- $this->arr = $arr;
- }
- /**
- * 得到父級(jí)數(shù)組
- * @param int
- * @return array
- */
- 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;
- }
- /**
- * 得到子級(jí)數(shù)組
- * @param int
- * @return array
- */
- 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;
- }
- /**
- * 獲取當(dāng)前節(jié)點(diǎn)所在的層級(jí)
- * @param $myid 當(dāng)前節(jié)點(diǎn)ID號(hào)
- * */
- 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;
- }
- /**
- * 獲取當(dāng)前節(jié)點(diǎn)所有底層節(jié)點(diǎn)(沒有子節(jié)點(diǎn)的節(jié)點(diǎn))的數(shù)量
- * @param $myid 節(jié)點(diǎn)ID號(hào)
- * @param $init 第一次加載將情況static變量
- * */
- 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;
- }
- /**
- * 獲取節(jié)點(diǎn)所有子節(jié)點(diǎn)ID號(hào)
- * @param $catid 節(jié)點(diǎn)ID號(hào)
- * @param $init 第一次加載將情況static初始化
- * */
- 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 ;
- }
- /**
- * 獲取該節(jié)點(diǎn)所有父節(jié)點(diǎn)ID號(hào)
- * @param $id 節(jié)點(diǎn)ID號(hào)
- * */
- 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;
- }
- /**
- * 獲取節(jié)點(diǎn)所在地行定位
- * @param $myid 節(jié)點(diǎn)ID號(hào)
- */
- public function get_row_location($myid){
- $nodearr = $this->arr;
- // 獲取每一個(gè)節(jié)點(diǎn)所在行的位置
- foreach ($nodearr as $key => $node){
- if($myid == $node['id']) {
- $node_row_count = 0;
- $arrparentid = explode(',', $node['arrparentid']);
- // 所有父節(jié)點(diǎn)小于當(dāng)前節(jié)點(diǎn)層次的底層節(jié)點(diǎn)等于0的元素
- 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 ++;
- }
- }
- }
- // 所有當(dāng)前節(jié)點(diǎn)并且節(jié)點(diǎn)層次(rowid_level)小于當(dāng)前節(jié)點(diǎn)層次的個(gè)數(shù)
- 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;
- }
- /**
- * 獲取表格的行數(shù)
- * */
- public function get_rows(){
- $row = 0;
- foreach ($this->arr as $key => $node){
- if($node['child_bottom_num'] == 0){
- $rows++; // 總行數(shù)
- }
- }
- return $rows;
- }
- /**
- * 獲取表格的列數(shù)
- * */
- public function get_columns(){
- $columns = 0 ;
- foreach ($this->arr as $key => $node){
- if($node['column'] > $columns){
- $columns = $node['column']; // 總列數(shù)
- }
- }
- return $columns;
- }
- /**
- * 獲取分類的表格展現(xiàn)形式(不包含表頭)
- * */
- 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>";
- }//開源代碼Vevb.com
- return $table_string;
- }
- }
- ?>
新聞熱點(diǎn)
疑難解答