本文章总结了两款PHP无限级分类实现程序代码,有需要学习的朋友可参考一下。
主要思路:首先看第三行和第四行,父类ID(PARENTID)的值是1,表示属于id=1这个类的子类,而,一,二两行因为是一级分类,没有上级分类,所以父类ID(PARENTID)的值是0,表示初级分类,依次类推便实现了无限级分类。最终的效果是:
├一级分类A
├─┴二级分类A
├─┴二级分类B
├一级分类B
然后就是程序,这里以PHP作为描述语言,可以很方便的改成其他语言,因为原理相似,就是一个递归而已。
<?php $dbhost = "localhost"; // 数据库主机名 $dbuser = "root"; // 数据库用户名 $dbpd = "123456"; // 数据库密码 $dbname = "test"; // 数据库名 mysql_connect($dbhost,$dbuser,$dbpd); //连接主机 mysql_select_db($dbname); //选择数据库 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)) { // 缩进显示节点名称 echo $tag.$row['classname'] . "<br/>"; //再次调用这个函数显示子节点的子节点 display_tree($tag."─┴",$row['id']); } } ?>
在表格中显示
TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构。
1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据。Tree算法请点击
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. 导入TreeTable类库。
代码如下:
import('@.ORG.Util.TableTree'); //Thinkphp导入方法
3. 生成TreeTable HTML代码
$treeTable->init($treearr); echo $treeTable->get_treetable();
注意:get_treetable()只生产表体部门,
完整代码
<?php /** * File name: TreeTable.class.php * Description: 通用的表格无限级分类 * */ /** * 表格展示无限分类是将无线分类已表格的形式表现出来,更好的能体现出分类的所属关系 * 使用方法: * 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'=>'一级栏目一'), * 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']); // 所有子节点 $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; } } return $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 第一次加载将情况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; } /** * 获取节点所有子节点ID号 * @param $catid 节点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 ; } /** * 获取该节点所有父节点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<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; } } ?>
希望本文所述对大家学习php程序设计有所帮助。

长URL(通常用关键字和跟踪参数都混乱)可以阻止访问者。 URL缩短脚本提供了解决方案,创建了简洁的链接,非常适合社交媒体和其他平台。 这些脚本对于单个网站很有价值

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

2025年的PHP景观调查调查了当前的PHP发展趋势。 它探讨了框架用法,部署方法和挑战,旨在为开发人员和企业提供见解。 该调查预计现代PHP Versio的增长

在本文中,我们将在Laravel Web框架中探索通知系统。 Laravel中的通知系统使您可以通过不同渠道向用户发送通知。今天,我们将讨论您如何发送通知OV


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)