/** * ファイル名: TreeTable.class.php * 作成者: run.gao 312854458@qq.com 日付: 2012-07-24 23:22 GMT+8 * 説明: ユニバーサル テーブルの無制限の分類 **/ /** * 無制限の分類のテーブル表示は、分類の所属関係をよりよく反映できるテーブル形式でワイヤレス分類を表現することです。 * 使用方法: * 1. 分類をインスタンス化します * $treeTable = new。 TreeTable(); * 2. 分類を初期化します。$treearr は多次元配列であり、id、parentid、name フィールドが含まれている必要があります * $treeTable->init($treearr); * 3. 無制限の分類 HTML コードを取得します * echo $treeTable-> ;get_treetable(); **/ class TreeTable { /** * ツリー構造の生成には 2 次元配列が必要です * @var array */ public $arr = array(); /** * テーブルの列数 * @var int */ public $columns = 0; /** * テーブルの行数 * @var int */ public $rows = 0; /** * TreeTable データを初期化します * @param array 2 次元 array * array( * 1 => array('id'=>'1','parentid'=>0,'name'=> ' 第 1 レベルの列 1'), * 2 => array('id'=>'2','parentid'=>0,'name'=>'第 1 レベルの列 2'), * 3 => array('id'=>'3','parentid'=>1,'name'=>'第 2 レベルの列 1'), * 4 => id'=> ;'4','parentid'=>1,'name'=>'第 2 レベルの列 2'), * 5 => array('id'=>5', 'parentid'=>2,'name'=>'第 2 レベルの列 3'), * 6 => array('id'=>6','parentid'=>3,'name '=>' 第 3 レベルの列 1'), * 7 => array('id'=>'7','parentid'=>3,'name'=>'第 3 レベルの列二') *) */ 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']) // すべての子ノード $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(); // 列の総数 // arrparentid と ID 番号で並べ替えます $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']; // マージされた行数 $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; } /** * arrparentid/id 番号で配列を並べ替えます **/ 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']; } // まず arrparentid で並べ替え、次に 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; } } } // ID をキー名として再計算します foreach ($this->arr as $k=> $ v) { $arr[$v['id']] = $v; } $this->arr = $arr; } /** * 親配列を取得します * @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; } /** * 子配列を取得します * @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; } } $newarr を返しますか? $newarr : false; } /** * 現在のノードのレベルを取得します * @param $myid 現在のノードのID番号 **/ 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; } /** * 現在のノードのすべての基になるノード (子ノードを持たないノード) の数を取得します * @param $myid ノード ID 番号 * @param $init 静的変数が初めてロードされます **/ 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; } /** * ノードのすべての子ノードの ID 番号を取得します * @param $catid ノード ID 番号 * @param $init 最初のロードで状況を静的に初期化します **/ 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 ; } /** * このノードのすべての親ノードの ID 番号を取得します * @param $id ノード ID 番号 **/ 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; } /** * ノードの行位置を取得します * @param $myid ノード ID 番号 */ 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']); // すべての父节点小以下当前节点层次的最下層节点に等しい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 ++; } } } //ノードおよびノードの次(rowid_level)は現在のノードの次の数 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 |