侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

php  /  管理员 发布于 7年前   166

本文章总结了两款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+mysql实现无限级分类 | 树型显示分类关系
  • php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
  • php实现无限级分类实现代码(递归方法)
  • 表格展示无限级分类(PHP版)
  • php 无限级分类,超级简单的无限级分类,支持输出树状图
  • ThinkPHP自动填充实现无限级分类的方法
  • ThinkPHP无限级分类原理实现留言与回复功能实例
  • php实现无限级分类
  • PHP实现无限级分类(不使用递归)
  • php实现无限级分类查询(递归、非递归)


  • 上一条:
    php+mysql实现无限级分类
    下一条:
    PHP中set error handler函数用法小结
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客