欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

表格展示無(wú)限級(jí)分類(lèi)(PHP版)

 更新時(shí)間:2012年08月21日 19:16:25   作者:  
TreeTable是一個(gè)能把無(wú)限分類(lèi)展現(xiàn)為表格形式的PHP類(lèi)庫(kù)插件,分類(lèi)的層級(jí)表示為表格的列,分類(lèi)的行數(shù)表格分類(lèi)的總數(shù)。單元格顯示分類(lèi)名稱(chēng)
TreeTable通過(guò)對(duì)單元格的行合并和列合并實(shí)現(xiàn)了無(wú)限層級(jí)也能較好的展示層級(jí)架構(gòu)。
1.構(gòu)建ID/PID/NAME的數(shù)組,后期可通過(guò)數(shù)據(jù)庫(kù)生成的動(dòng)態(tài)數(shù)據(jù)。Tree算法請(qǐng)點(diǎn)擊
復(fù)制代碼 代碼如下:

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類(lèi)庫(kù)。
復(fù)制代碼 代碼如下:

import('@.ORG.Util.TableTree'); //Thinkphp導(dǎo)入方法

3. 生成TreeTable HTML代碼
復(fù)制代碼 代碼如下:

$treeTable->init($treearr);
echo $treeTable->get_treetable();

注意:get_treetable()只生產(chǎn)表體部門(mén),<TALBE></TABLE>請(qǐng)自行構(gòu)建。
完整代碼
復(fù)制代碼 代碼如下:

<?php
/**
* File name: TreeTable.class.php
* Author: run.gao 312854458@qq.com Date: 2012-07-24 23:22 GMT+8
* Description: 通用的表格無(wú)限級(jí)分類(lèi)
* */
/**
* 表格展示無(wú)限分類(lèi)是將無(wú)線(xiàn)分類(lèi)已表格的形式表現(xiàn)出來(lái),更好的能體現(xiàn)出分類(lèi)的所屬關(guān)系
* 使用方法:
* 1. 實(shí)例化分類(lèi)
* $treeTable = new TreeTable();
* 2. 初始化分類(lèi),$treearr必須是一個(gè)多維數(shù)組且包含 id,parentid,name字段
* $treeTable->init($treearr);
* 3. 獲取無(wú)限分類(lèi)HTML代碼
* echo $treeTable->get_treetable();
* */
class TreeTable {
/**
* 生成樹(shù)型結(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)(沒(méi)有子節(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;
}
/**
* 獲取分類(lèi)的表格展現(xiàn)形式(不包含表頭)
* */
public function get_treetable(){
$table_string = '';
for($row = 1; $row <= $this->rows; $row++){
$table_string .= "\r\t<tr>";
foreach ($this->arr as $v){
if($v['row'] == $row){
$rowspan = $v['rowspan'] ? "rowspan='{$v['rowspan']}'" : '';
$colspan = $v['colspan'] ? "colspan='{$v['colspan']}'" : '';
$table_string .= "\r\t\t<td {$rowspan} {$colspan}>
{$v['name']}
</td>";
}
}
$table_string .= "\r\t</tr>";
}
return $table_string;
}
}
?>

相關(guān)文章

  • php實(shí)現(xiàn)網(wǎng)站插件機(jī)制的方法

    php實(shí)現(xiàn)網(wǎng)站插件機(jī)制的方法

    這些天想作一個(gè)在網(wǎng)站中實(shí)現(xiàn)插件的功能,谷歌了一下,發(fā)現(xiàn)一篇文章感覺(jué)對(duì)我?guī)椭艽?,帖出?lái)和大家分享,廢話(huà)不多說(shuō),直接帖出代碼供大家分析.
    2009-11-11
  • Laravel中的Blade模板引擎示例詳解

    Laravel中的Blade模板引擎示例詳解

    laravel的模版引擎采用了blade模版引擎,下面這篇文章主要給大家介紹了關(guān)于Laravel中Blade模板引擎的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • ThinkPHP多語(yǔ)言支持與多模板支持概述

    ThinkPHP多語(yǔ)言支持與多模板支持概述

    這篇文章主要介紹了ThinkPHP多語(yǔ)言支持與多模板支持,是ThinkPHP非常重要的技巧,需要的朋友可以參考下
    2014-08-08
  • PHP創(chuàng)建自己的Composer包方法

    PHP創(chuàng)建自己的Composer包方法

    這篇文章主要介紹了PHP創(chuàng)建自己的Composer包方法
    2018-04-04
  • thinkphp中ajax與php響應(yīng)過(guò)程詳解

    thinkphp中ajax與php響應(yīng)過(guò)程詳解

    這篇文章主要介紹了thinkphp中ajax與php響應(yīng)過(guò)程,以實(shí)例形式詳細(xì)分析了ThinkPHP框架中Ajax響應(yīng)方式的處理原理及實(shí)現(xiàn)過(guò)程,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • PHP實(shí)現(xiàn)驗(yàn)證碼校驗(yàn)功能

    PHP實(shí)現(xiàn)驗(yàn)證碼校驗(yàn)功能

    這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)驗(yàn)證碼校驗(yàn)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • PHP通過(guò)pem文件校驗(yàn)簽名異常問(wèn)題解決

    PHP通過(guò)pem文件校驗(yàn)簽名異常問(wèn)題解決

    在對(duì)接第三方支付過(guò)程中,支付成功異步回調(diào)時(shí),校驗(yàn)簽名,一直無(wú)法通過(guò),最后經(jīng)過(guò)排查,是引用秘鑰文件時(shí),報(bào)錯(cuò)了,本文給大家分享PHP通過(guò)pem文件校驗(yàn)簽名異常問(wèn)題解決方法,需要的朋友可以參考下
    2023-09-09
  • PHP中對(duì)于浮點(diǎn)型的數(shù)據(jù)需要用不同的方法解決

    PHP中對(duì)于浮點(diǎn)型的數(shù)據(jù)需要用不同的方法解決

    這篇文章主要介紹了PHP中對(duì)于浮點(diǎn)型的數(shù)據(jù)需要用不同的方法解決。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-03-03
  • PHP進(jìn)程同步代碼實(shí)例

    PHP進(jìn)程同步代碼實(shí)例

    這篇文章主要介紹了PHP進(jìn)程同步代碼實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • PHP命名空間(namespace)的使用基礎(chǔ)及示例

    PHP命名空間(namespace)的使用基礎(chǔ)及示例

    本文介紹了PHP命名空間的一些術(shù)語(yǔ),其解析規(guī)則,以及一些高級(jí)功能的應(yīng)用,希望能夠幫助讀者在項(xiàng)目中真正使用命名空間。
    2014-08-08

最新評(píng)論