2款PHP无限级分类实例代码,2款php无限实例
本文章总结了两款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程序设计有所帮助。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
