PHP无限级分类的实例代码分析
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要讲解了"PHP无限级分类的实例代码分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"PHP无限级分类的实例代码分析"吧!主要思路:首先看第
千家信息网最后更新 2025年01月20日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 ";}return $table_string;}}?>{$v['name']} ";}}$table_string .= "rt
感谢各位的阅读,以上就是"PHP无限级分类的实例代码分析"的内容了,经过本文的学习后,相信大家对PHP无限级分类的实例代码分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
节点
分类
栏目
代码
数据
数组
数据库
排序
表格
实例
分析
层次
位置
就是
层级
底层
情况
所在
学习
生成
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
GALE数据库技术学院
数据库添加
软件开发用c
java代码新建数据库
mysql数据库运维工具
上海营销网络技术服务电话
开源网络安全工具排名
无法被服务器理解的http状态
ppt制作服务器配置
二层三层网络技术
服务器存储技术方案
tbc木喉要塞服务器人口
sci要上传原始数据库
数据库成都培训
java数据库访问类
凯欣互联网科技
江西省网络安全教育宣传周
数据库如何计算虚值
安卓软件开发用到的算法
数据库 怎么追加
没上市的科技互联网公司
国产 网络安全 股票
以太坊搭建数据库
福建网络安全平台作业答案
法国网络安全现状
idc回收服务器安全吗
石家庄企业软件开发哪家好
银行的软件开发需要拉存款吗
网络安全包抬哪些项目
三星svoice网络服务器错误