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("SETNAMES'utf8'");
display_tree("├",0);
functiondisplay_tree($tag,$classid){
$result=mysql_query("
SELECT*
FROMylmf_class
WHEREparentid='".$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.生成TreeTableHTML代码
$treeTable->init($treearr); echo$treeTable->get_treetable();
注意:get_treetable()只生产表体部门,<TALBE></TABLE>请自行构建。
完整代码
<?php
/**
*Filename:TreeTable.class.php
*Description:通用的表格无限级分类
**/
/**
*表格展示无限分类是将无线分类已表格的形式表现出来,更好的能体现出分类的所属关系
*使用方法:
*1.实例化分类
*$treeTable=newTreeTable();
*2.初始化分类,$treearr必须是一个多维数组且包含id,parentid,name字段
*$treeTable->init($treearr);
*3.获取无限分类HTML代码
*echo$treeTable->get_treetable();
**/
classTreeTable{
/**
*生成树型结构所需要的2维数组
*@vararray
*/
public$arr=array();
/**
*表格列数
*@varint
*/
public$columns=0;
/**
*表格行数
*@varint
*/
public$rows=0;
/**
*初始化TreeTable数据
*@paramarray2维数组
*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'=>'三级栏目二')
*)
*/
publicfunctioninit($arr=array()){
if(!is_array($arr))returnfalse;
foreach($arras$k=>$v){
$this->arr[$v['id']]=$v;
}
foreach($this->arras$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->arras$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();
}
/**
*获取数组
**/
publicfunctionget_tree_arr(){
returnis_array($this->arr)?$this->arr:false;
}
/**
*按arrparentid/id号依次重新排序数组
**/
publicfunctionsort_arr(){
//要进行排序的字段
foreach($this->arras$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->arras$key=>$node){
if($node['column']==$column){
$row_level++;
$this->arr[$key]['column_level']=$row_level;
}
}
}
//重新计算以ID作为键名
foreach($this->arras$k=>$v){
$arr[$v['id']]=$v;
}
$this->arr=$arr;
}
/**
*得到父级数组
*@paramint
*@returnarray
*/
publicfunctionget_parent($myid){
$newarr=array();
if(!isset($this->arr[$myid]))returnfalse;
$pid=$this->arr[$myid]['parentid'];
$pid=$this->arr[$pid]['parentid'];
if(is_array($this->arr)){
foreach($this->arras$id=>$a){
if($a['parentid']==$pid)$newarr[$id]=$a;
}
}
return$newarr;
}
/**
*得到子级数组
*@paramint
*@returnarray
*/
publicfunctionget_child($myid){
$a=$newarr=array();
if(is_array($this->arr)){
foreach($this->arras$id=>$a){
if($a['parentid']==$myid)$newarr[$id]=$a;
}
}
return$newarr?$newarr:false;
}
/**
*获取当前节点所在的层级
*@param$myid当前节点ID号
**/
publicfunctionget_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变量
**/
publicfunctionget_child_count($myid,$init=true){
static$count=0;
if($init)$count=0;
if(!$this->get_child($myid)&&$init)return0;
if($childarr=$this->get_child($myid)){
foreach($childarras$v){
$this->get_child_count($v['id'],false);
}
}else{
$count++;
}
return$count;
}
/**
*获取节点所有子节点ID号
*@param$catid节点ID号
*@param$init第一次加载将情况static初始化
**/
publicfunctionget_arrchildid($myid,$init=true){
static$childid;
if($init)$childid='';
if(!is_array($this->arr))returnfalse;
foreach($this->arras$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号
**/
publicfunctionget_arrparentid($id,$arrparentid=''){
if(!is_array($this->arr))returnfalse;
$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号
*/
publicfunctionget_row_location($myid){
$nodearr=$this->arr;
//获取每一个节点所在行的位置
foreach($nodearras$key=>$node){
if($myid==$node['id']){
$node_row_count=0;
$arrparentid=explode(',',$node['arrparentid']);
//所有父节点小于当前节点层次的底层节点等于0的元素
foreach($arrparentidas$pid){
foreach($nodearras$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($nodearras$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;
}
/**
*获取表格的行数
**/
publicfunctionget_rows(){
$row=0;
foreach($this->arras$key=>$node){
if($node['child_bottom_num']==0){
$rows++;//总行数
}
}
return$rows;
}
/**
*获取表格的列数
**/
publicfunctionget_columns(){
$columns=0;
foreach($this->arras$key=>$node){
if($node['column']>$columns){
$columns=$node['column'];//总列数
}
}
return$columns;
}
/**
*获取分类的表格展现形式(不包含表头)
**/
publicfunctionget_treetable(){
$table_string='';
for($row=1;$row<=$this->rows;$row++){
$table_string.="rt<tr>";
foreach($this->arras$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程序设计有所帮助。