当前位置:首页 > PHP教程 > php应用 > 列表

2款PHP无限级分类实例代码

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-26 14:27:37 浏览: 评论:0 

这篇文章主要介绍了2款PHP无限级分类实例代码,需要的朋友可以参考下

本文章总结了两款PHP无限级分类实现程序代码,有需要学习的朋友可参考一下。

主要思路:首先看第三行和第四行,父类ID(PARENTID)的值是1,表示属于id=1这个类的子类,而,一,二两行因为是一级分类,没有上级分类,所以父类ID(PARENTID)的值是0,表示初级分类,依次类推便实现了无限级分类。最终的效果是:

  1. ├一级分类A 
  2. ├─┴二级分类A 
  3. ├─┴二级分类B 
  4. ├一级分类B 

然后就是程序,这里以PHP作为描述语言,可以很方便的改成其他语言,因为原理相似,就是一个递归而已。

  1. <?php 
  2. $dbhost = "localhost";  // 数据库主机名 
  3. $dbuser = "root";  // 数据库用户名 
  4. $dbpd = "123456";  // 数据库密码 
  5. $dbname = "test";  // 数据库名 
  6. mysql_connect($dbhost,$dbuser,$dbpd);    //连接主机 
  7. mysql_select_db($dbname);    //选择数据库 
  8. mysql_query("SET NAMES 'utf8'"); 
  9. display_tree("├",0); 
  10. function display_tree($tag,$classid) { 
  11.   $result = mysql_query(" 
  12.     SELECT * 
  13.     FROM ylmf_class 
  14.     WHERE parentid = '" . $classid . "' 
  15.     ;" 
  16.   ); 
  17.   while ($row = mysql_fetch_array($result)) { 
  18.     // 缩进显示节点名称 
  19.  echo $tag.$row['classname'] . "<br/>"
  20.     //再次调用这个函数显示子节点的子节点 
  21.  display_tree($tag."─┴",$row['id']); 
  22.   } 
  23. ?> 

在表格中显示

TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构。

1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据。Tree算法请点击

  1. array
  2. * 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'), 
  3. * 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'), 
  4. * 3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'), 
  5. * 4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'), 
  6. * 5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'), 
  7. * 6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'), 
  8. * 7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二'
  9. * ) 

2. 导入TreeTable类库。

代码如下:

import('@.ORG.Util.TableTree'); //Thinkphp导入方法

3. 生成TreeTable HTML代码

$treeTable->init($treearr);

echo $treeTable->get_treetable();

注意:get_treetable()只生产表体部门,<TALBE></TABLE>请自行构建。

完整代码:

  1. <?php 
  2. /** 
  3. * File name: TreeTable.class.php 
  4. * Description: 通用的表格无限级分类 
  5. * */ 
  6. /** 
  7. * 表格展示无限分类是将无线分类已表格的形式表现出来,更好的能体现出分类的所属关系 
  8. * 使用方法: 
  9. * 1. 实例化分类 
  10. * $treeTable = new TreeTable(); 
  11. * 2. 初始化分类,$treearr必须是一个多维数组且包含 id,parentid,name字段 
  12. * $treeTable->init($treearr); 
  13. * 3. 获取无限分类HTML代码 
  14. * echo $treeTable->get_treetable(); 
  15. * */ 
  16. class TreeTable { 
  17. /** 
  18. * 生成树型结构所需要的2维数组 
  19. * @var array 
  20. */ 
  21. public $arr = array(); 
  22. /** 
  23. * 表格列数 
  24. * @var int 
  25. */ 
  26. public $columns = 0; 
  27. /** 
  28. * 表格行数 
  29. * @var int 
  30. */ 
  31. public $rows = 0; 
  32. /** 
  33. * 初始化TreeTable数据 
  34. * @param array 2维数组 
  35. * array( 
  36. * 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'), 
  37. * 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'), 
  38. * 3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'), 
  39. * 4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'), 
  40. * 5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'), 
  41. * 6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'), 
  42. * 7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二') 
  43. * ) 
  44. */ 
  45. public function init($arr=array()){ 
  46. if(!is_array($arr)) return false; 
  47. foreach ($arr as $k=>$v) { 
  48. $this->arr[$v['id']] = $v
  49. foreach ($this->arr as $k => $v){ 
  50. $this->arr[$k]['column'] = $this->get_level($v['id']); // Y轴位置 
  51. $this->arr[$k]['arrchildid'] = $this->get_arrchildid($v['id']); // 所有子节点 
  52. $this->arr[$k]['arrparentid'] = $this->get_arrparentid($v['id']); // 所有父节点 
  53. $this->arr[$k]['child_bottom_num'] = $this->get_child_count($v['id']); // 所有底层元素节点 
  54. $this->columns = $this->get_columns(); // 总行数 
  55. $this->rows = $this->get_rows(); // 总列数 
  56. // 按照arrparentid和id号进行排序 
  57. $this->sort_arr(); 
  58. foreach ($this->arr as $k => $v){ 
  59. $this->arr[$k]['row'] = $this->get_row_location($v['id']); // X轴位置 
  60. $this->arr[$k]['rowspan'] = $v['child_bottom_num']; // 行合并数 
  61. $this->arr[$k]['colspan'] = $v['child_bottom_num'] == 0 ? $this->columns - $v['column'] + 1 : 0; //列合并数 
  62. return $this->get_tree_arr(); 
  63. /** 
  64. * 获取数组 
  65. * */ 
  66. public function get_tree_arr(){ 
  67. return is_array($this->arr) ? $this->arr : false; 
  68. /** 
  69. * 按arrparentid/id号依次重新排序数组 
  70. * */ 
  71. public function sort_arr(){ 
  72. // 要进行排序的字段 
  73. foreach ($this->arr as $k => $v){ 
  74. $order_pid_arr[$k] = $v['arrparentid']; 
  75. $order_iscost[] = $v['sort']; 
  76. $order_id_arr[$k] = $v['id']; 
  77. // 先根据arrparentid排序,再根据排序,id号排序 
  78. array_multisort
  79. $order_pid_arr, SORT_ASC, SORT_STRING, 
  80. $order_iscost, SORT_DESC, SORT_NUMERIC, 
  81. $order_id_arr, SORT_ASC, SORT_NUMERIC, 
  82. $this->arr); 
  83. // 获取每一个节点层次 
  84. for ($column = 1; $column <= $this->columns; $column++) { 
  85. $row_level = 0; 
  86. foreach ($this->arr as $key => $node){ 
  87. if ($node['column'] == $column){ 
  88. $row_level++; 
  89. $this->arr[$key]['column_level'] = $row_level
  90. // 重新计算以ID作为键名 
  91. foreach ($this->arr as $k=>$v) { 
  92. $arr[$v['id']] = $v
  93. $this->arr = $arr
  94. /** 
  95. * 得到父级数组 
  96. * @param int 
  97. * @return array 
  98. */ 
  99. public function get_parent($myid){ 
  100. $newarr = array(); 
  101. if(!isset($this->arr[$myid])) return false; 
  102. $pid = $this->arr[$myid]['parentid']; 
  103. $pid = $this->arr[$pid]['parentid']; 
  104. if(is_array($this->arr)){ 
  105. foreach($this->arr as $id => $a){ 
  106. if($a['parentid'] == $pid$newarr[$id] = $a
  107. return $newarr
  108. /** 
  109. * 得到子级数组 
  110. * @param int 
  111. * @return array 
  112. */ 
  113. public function get_child($myid){ 
  114. $a = $newarr = array(); 
  115. if(is_array($this->arr)){ 
  116. foreach($this->arr as $id => $a){ 
  117. if($a['parentid'] == $myid$newarr[$id] = $a
  118. return $newarr ? $newarr : false; 
  119. /** 
  120. * 获取当前节点所在的层级 
  121. * @param $myid 当前节点ID号 
  122. * */ 
  123. public function get_level($myid$init = true){ 
  124. static $level = 1; 
  125. if($init$level = 1; 
  126. if ($this->arr[$myid]['parentid']) { 
  127. $level++; 
  128. $this->get_level($this->arr[$myid]['parentid'], false); 
  129. return $level
  130. /** 
  131. * 获取当前节点所有底层节点(没有子节点的节点)的数量 
  132. * @param $myid 节点ID号 
  133. * @param $init 第一次加载将情况static变量 
  134. * */ 
  135. public function get_child_count($myid$init = true){ 
  136. static $count = 0; 
  137. if($init$count = 0; 
  138. if(!$this->get_child($myid) && $initreturn 0; 
  139. if($childarr = $this->get_child($myid)){ 
  140. foreach ($childarr as $v){ 
  141. $this->get_child_count($v['id'], false); 
  142. }else
  143. $count++; 
  144. return $count
  145. /** 
  146. * 获取节点所有子节点ID号 
  147. * @param $catid 节点ID号 
  148. * @param $init 第一次加载将情况static初始化 
  149. * */ 
  150. public function get_arrchildid($myid$init = true) { 
  151. static $childid
  152. if($init$childid = ''
  153. if(!is_array($this->arr)) return false; 
  154. foreach($this->arr as $id => $a){ 
  155. if($a['parentid'] == $myid) { 
  156. $childid = $childid ? $childid.','.$a['id'] : $a['id']; 
  157. $this->get_arrchildid($a['id'], false); 
  158. return $childid ; 
  159. /** 
  160. * 获取该节点所有父节点ID号 
  161. * @param $id 节点ID号 
  162. * */ 
  163. public function get_arrparentid($id$arrparentid = '') { 
  164. if(!is_array($this->arr)) return false; 
  165. $parentid = $this->arr[$id]['parentid']; 
  166. if($parentid > 0) $arrparentid = $arrparentid ? $parentid.','.$arrparentid : $parentid
  167. if($parentid$arrparentid = $this->get_arrparentid($parentid$arrparentid); 
  168. return $arrparentid
  169. /** 
  170. * 获取节点所在地行定位 
  171. * @param $myid 节点ID号 
  172. */ 
  173. public function get_row_location($myid){ 
  174. $nodearr = $this->arr; 
  175. // 获取每一个节点所在行的位置 
  176. foreach ($nodearr as $key => $node){ 
  177. if($myid == $node['id']) { 
  178. $node_row_count = 0; 
  179. $arrparentid = explode(','$node['arrparentid']); 
  180. // 所有父节点小于当前节点层次的底层节点等于0的元素 
  181. foreach ($arrparentid as $pid){ 
  182. foreach ($nodearr as $node_row){ 
  183. if($node_row['column'] == $nodearr[$pid]['column'] && $nodearr[$pid]['column_level'] > $node_row['column_level'] && $node_row['child_bottom_num'] == 0){ 
  184. $node_row_count ++; 
  185. // 所有当前节点并且节点层次(rowid_level)小于当前节点层次的个数 
  186. foreach ($nodearr as $node_row){ 
  187. if($node['column'] == $node_row['column'] && $node_row['column_level'] < $node['column_level']){ 
  188. $node_row_count += $node_row['child_bottom_num'] ? $node_row['child_bottom_num'] : 1; 
  189. $node_row_count++; 
  190. break
  191. return $node_row_count
  192. /** 
  193. * 获取表格的行数 
  194. * */ 
  195. public function get_rows(){ 
  196. $row = 0; 
  197. foreach ($this->arr as $key => $node){ 
  198. if($node['child_bottom_num'] == 0){ 
  199. $rows++; // 总行数 
  200. return $rows
  201. /** 
  202. * 获取表格的列数 
  203. * */ 
  204. public function get_columns(){ 
  205. $columns = 0 ; 
  206. foreach ($this->arr as $key => $node){ 
  207. if($node['column'] > $columns){ 
  208. $columns = $node['column']; // 总列数 
  209. return $columns
  210. /** 
  211. * 获取分类的表格展现形式(不包含表头) 
  212. * */ 
  213. public function get_treetable(){ 
  214. $table_string = ''
  215. for($row = 1; $row <= $this->rows; $row++){ 
  216. $table_string .= "rt<tr>"
  217. foreach ($this->arr as $v){ 
  218. if($v['row'] == $row){ 
  219. $rowspan = $v['rowspan'] ? "rowspan='{$v['rowspan']}'" : ''
  220. $colspan = $v['colspan'] ? "colspan='{$v['colspan']}'" : ''
  221. $table_string .= "rtt<td {$rowspan} {$colspan}> 
  222. {$v['name']} 
  223. </td>"; 
  224. $table_string .= "rt</tr>"
  225. return $table_string
  226. ?> 

希望本文所述对大家学习php程序设计有所帮助。

Tags: PHP无限级分类

分享到: