PHP无限级分类的实例代码分析
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要讲解了"PHP无限级分类的实例代码分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"PHP无限级分类的实例代码分析"吧!主要思路:首先看第
千家信息网最后更新 2025年11月13日PHP无限级分类的实例代码分析
这篇文章主要讲解了"PHP无限级分类的实例代码分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"PHP无限级分类的实例代码分析"吧!
主要思路:首先看第三行和第四行,父类ID(PARENTID)的值是1,表示属于id=1这个类的子类,而,一,二两行因为是一级分类,没有上级分类,所以父类ID(PARENTID)的值是0,表示初级分类,依次类推便实现了无限级分类。最终的效果是:
├一级分类A
├─┴二级分类A
├─┴二级分类B
├一级分类B
然后就是程序,这里以PHP作为描述语言,可以很方便的改成其他语言,因为原理相似,就是一个递归而已。
"; //再次调用这个函数显示子节点的子节点 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()只生产表体部门,
完整代码
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";foreach ($this->arr as $v){if($v['row'] == $row){$rowspan = $v['rowspan'] ? "rowspan='{$v['rowspan']}'" : '';$colspan = $v['colspan'] ? "colspan='{$v['colspan']}'" : '';$table_string .= "rtt{$v['name']} ";}}$table_string .= "rt ";}return $table_string;}}?>感谢各位的阅读,以上就是"PHP无限级分类的实例代码分析"的内容了,经过本文的学习后,相信大家对PHP无限级分类的实例代码分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
节点
分类
栏目
代码
数据
数组
数据库
排序
表格
实例
分析
层次
位置
就是
层级
底层
情况
所在
学习
生成
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全绘画一等奖教程
有关语言测试数据库有哪些
北京画图软件开发
北京人人车网络技术
四子王旗网络安全应急指挥中心
ibm服务器sn
工业互联网德风科技有限公司
网络安全周指南
ios软件开发揭密
软件开发所涉及的税种及税率
云南时代网络技术服务产品介绍
网络技术公司的企业想法描述
盛世十月软件开发有限公司
网络安全在身边作文初中
陕西hp服务器维修哪家好
服务器开启全部端口安全吗
数据库的完整性和安全性.
数据库提交事物的方法
网络安全宣传周怎么上网
网络安全专网通信板块
matlab载入数据库
乐高网络技术
元宇宙离不开网络安全
服务器本地连接用不了
怎么查数据库某一字段的最小值
周网络安全宣传计划
游戏角色占用服务器
灌云有名的网络技术排名靠前
物流网络技术定义
hmcl服务器删了怎么找回来