2款PHP無限級分類實例代碼
本文章總結(jié)了兩款PHP無限級分類實現(xiàn)程序代碼,有需要學(xué)習(xí)的朋友可參考一下。
主要思路:首先看第三行和第四行,父類ID(PARENTID)的值是1,表示屬于id=1這個類的子類,而,一,二兩行因為是一級分類,沒有上級分類,所以父類ID(PARENTID)的值是0,表示初級分類,依次類推便實現(xiàn)了無限級分類。最終的效果是:
├一級分類A
├─┴二級分類A
├─┴二級分類B
├一級分類B
然后就是程序,這里以PHP作為描述語言,可以很方便的改成其他語言,因為原理相似,就是一個遞歸而已。
<?php $dbhost = "localhost"; // 數(shù)據(jù)庫主機(jī)名 $dbuser = "root"; // 數(shù)據(jù)庫用戶名 $dbpd = "123456"; // 數(shù)據(jù)庫密碼 $dbname = "test"; // 數(shù)據(jù)庫名 mysql_connect($dbhost,$dbuser,$dbpd); //連接主機(jī) mysql_select_db($dbname); //選擇數(shù)據(jù)庫 mysql_query("SET NAMES 'utf8'"); display_tree("├",0); function display_tree($tag,$classid) { $result = mysql_query(" SELECT * FROM ylmf_class WHERE parentid = '" . $classid . "' ;" ); while ($row = mysql_fetch_array($result)) { // 縮進(jìn)顯示節(jié)點(diǎn)名稱 echo $tag.$row['classname'] . "<br/>"; //再次調(diào)用這個函數(shù)顯示子節(jié)點(diǎn)的子節(jié)點(diǎn) display_tree($tag."─┴",$row['id']); } } ?>
在表格中顯示
TreeTable通過對單元格的行合并和列合并實現(xiàn)了無限層級也能較好的展示層級架構(gòu)。
1.構(gòu)建ID/PID/NAME的數(shù)組,后期可通過數(shù)據(jù)庫生成的動態(tài)數(shù)據(jù)。Tree算法請點(diǎn)擊
array( * 1 => array('id'=>'1','parentid'=>0,'name'=>'一級欄目一'), * 2 => array('id'=>'2','parentid'=>0,'name'=>'一級欄目二'), * 3 => array('id'=>'3','parentid'=>1,'name'=>'二級欄目一'), * 4 => array('id'=>'4','parentid'=>1,'name'=>'二級欄目二'), * 5 => array('id'=>'5','parentid'=>2,'name'=>'二級欄目三'), * 6 => array('id'=>'6','parentid'=>3,'name'=>'三級欄目一'), * 7 => array('id'=>'7','parentid'=>3,'name'=>'三級欄目二') * )
2. 導(dǎo)入TreeTable類庫。
代碼如下:
import('@.ORG.Util.TableTree'); //Thinkphp導(dǎo)入方法
3. 生成TreeTable HTML代碼
$treeTable->init($treearr); echo $treeTable->get_treetable();
注意:get_treetable()只生產(chǎn)表體部門,<TALBE></TABLE>請自行構(gòu)建。
完整代碼
<?php /** * File name: TreeTable.class.php * Description: 通用的表格無限級分類 * */ /** * 表格展示無限分類是將無線分類已表格的形式表現(xiàn)出來,更好的能體現(xiàn)出分類的所屬關(guān)系 * 使用方法: * 1. 實例化分類 * $treeTable = new TreeTable(); * 2. 初始化分類,$treearr必須是一個多維數(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'=>'一級欄目一'), * 2 => array('id'=>'2','parentid'=>0,'name'=>'一級欄目二'), * 3 => array('id'=>'3','parentid'=>1,'name'=>'二級欄目一'), * 4 => array('id'=>'4','parentid'=>1,'name'=>'二級欄目二'), * 5 => array('id'=>'5','parentid'=>2,'name'=>'二級欄目三'), * 6 => array('id'=>'6','parentid'=>3,'name'=>'三級欄目一'), * 7 => array('id'=>'7','parentid'=>3,'name'=>'三級欄目二') * ) */ 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號進(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號依次重新排序數(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號排序 array_multisort( $order_pid_arr, SORT_ASC, SORT_STRING, $order_iscost, SORT_DESC, SORT_NUMERIC, $order_id_arr, SORT_ASC, SORT_NUMERIC, $this->arr); // 獲取每一個節(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; } } } // 重新計算以ID作為鍵名 foreach ($this->arr as $k=>$v) { $arr[$v['id']] = $v; } $this->arr = $arr; } /** * 得到父級數(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; } /** * 得到子級數(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)所在的層級 * @param $myid 當(dāng)前節(jié)點(diǎn)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; } /** * 獲取當(dāng)前節(jié)點(diǎn)所有底層節(jié)點(diǎn)(沒有子節(jié)點(diǎn)的節(jié)點(diǎn))的數(shù)量 * @param $myid 節(jié)點(diǎn)ID號 * @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號 * @param $catid 節(jié)點(diǎn)ID號 * @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號 * @param $id 節(jié)點(diǎn)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; } /** * 獲取節(jié)點(diǎn)所在地行定位 * @param $myid 節(jié)點(diǎn)ID號 */ public function get_row_location($myid){ $nodearr = $this->arr; // 獲取每一個節(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)層次的個數(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>"; } return $table_string; } } ?>
希望本文所述對大家學(xué)習(xí)php程序設(shè)計有所幫助。
相關(guān)文章
php實現(xiàn)refresh刷新頁面批量導(dǎo)入數(shù)據(jù)的方法
這篇文章主要介紹了php實現(xiàn)refresh刷新頁面批量導(dǎo)入數(shù)據(jù)的方法,借鑒了dedecms批量生成html的原理,采用refresh代替js跳轉(zhuǎn)來實現(xiàn),非常具有實用價值,需要的朋友可以參考下2014-12-12有關(guān)PHP中MVC的開發(fā)經(jīng)驗分享
經(jīng)過近一個月對MVC的研究,自己也通過網(wǎng)上有朋友的指導(dǎo),有了一套自己的MVC流程及框架,但是感覺缺限還是很多,靈活性方面還是欠缺,但又不知道怎么樣的具體改進(jìn),今天我就把我的流程及思想發(fā)布,希望有高人能夠指點(diǎn)指點(diǎn)2012-05-05PHP基于curl模擬post提交json數(shù)據(jù)示例
這篇文章主要介紹了PHP基于curl模擬post提交json數(shù)據(jù)操作,結(jié)合實例形式分析了php使用curl實現(xiàn)post方式提交json數(shù)據(jù)相關(guān)操作步驟與注意事項,代碼簡單實用,需要的朋友可以參考下2018-06-06六酷社區(qū)論壇HOME頁清新格調(diào)免費(fèi)版 下載
六酷社區(qū)論壇HOME頁清新格調(diào)免費(fèi)版 下載...2007-03-03PHP實現(xiàn)處理三級分類數(shù)據(jù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用PHP實現(xiàn)處理三級分類數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考一下2024-02-02php實現(xiàn)word轉(zhuǎn)html的方法
這篇文章主要介紹了php實現(xiàn)word轉(zhuǎn)html的方法,涉及PHP調(diào)用com組件操作word文檔的相關(guān)技巧,需要的朋友可以參考下2016-01-01