TreeTable は、セルの行と列を結合することで無限のレベルを実現し、階層構造をより適切に表示できます。
1. ID/PID/NAME の配列を構築し、後でデータベースによって生成された動的データを使用します。ツリー アルゴリズムの場合、
をクリックしてコード をコピーしてください。コードは次のとおりです。
array(
* 1) => array('id '=>1','parentid'=>0,'name'=>'第 1 レベルの列 1'),
* 2 => '=>'2', 'parentid'=>0,'name'=>'第 1 レベルの列 2')、
* 3 => array('id'=>3' ,'parentid'=>1, 'name'=>'第 2 レベルの列 1'),
* 4 => array('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 レベルの列 2')
* )
コードをコピーします コードは次のとおりです。
import('@.ORG.Util.TableTree'); // Thinkphp インポート メソッド
コードをコピーします コードは次のとおりです:
$treeTable->init($treearr);
echo $treeTable->get_treetable();
コードをコピー コードは次のとおりです:
/**
* ファイル名: 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(
* 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 => array('id'=>4','parentid'=>1,'name'=>'第 2 レベル列 2'),
* 5 => 配列 ('id'=>'5','parentid'=>2,'name'=>'第 2 レベルの列 3')、
* 6 => id'=>' 6','parentid'=>3,'name'=>'第 3 レベル列 1')、
* 7 => array('id'=> ','parentid'=> ;3,'name'=>'第 3 レベルの列 2')
* )
*/
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(); 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) ? >arr : false ;
}
/**
* arrparentid/id 番号で配列を並べ替えます
**/
public function sort_arr(){
// 並べ替えるフィールド
foreach ($this-> arr as $k = > $v){
$order_pid_arr[$k] = $v['arrparentid']
$order_iscost[] = $v['sort']; [$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 = 配列( );
if(!isset($this->arr[$myid])) return false; > $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] = $ ;
}
}
$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->gt;arr[$myid]['parentid'], false);
}
$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'],間違い);
}
}else{
$count ;
}
$count を返します。
}
/**
* ノードのすべての子ノードの ID 番号を取得します
* @param $catid ノード ID 番号
* @param $init 最初のロードでシチュエーションが静的に初期化されます
**/
public function get_arrchildid($myid, $init = true) {
static $childid;
if($init) $childid = '';
if(!is_array($this->arr)) は false を返します。
foreach($this->arr as $id => $a){
if($a['parentid'] == $myid) {
$childid = $childid ? $childid.','.$a['id'] : $a['id'];
$this->get_arrchildid($a['id'], false);
}
}
$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);
$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']);
// すべての父节点が現在の节点層次の最下層节点より小さい元素
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 ;
休憩;
}
}
return $node_row_count;
}
/**
* テーブル内の行数を取得します
**/
パブリック関数 get_rows(){
$row = 0;
foreach ($this->arr as $key => $node){
if($node['child_bottom_num'] == 0){
$rows ; // 行数
}
}
return $rows;
}
/**
* テーブル内の列の数を取得します
**/
パブリック関数 get_columns(){
$columns = 0 ;
foreach ($this->arr as $key =>$node){
if($node['column'] > $columns){
$columns = $node['column ']; // 总列数
}
}
return $columns;
}
/**
* カテゴリのテーブル表示形式を取得(ヘッダーを除く)
**/
パブリック関数 get_treetable(){
$table_string = '';
for($row = 1; $row rows; $row ){
$table_string .= "rt