php 无限级分类,超级简单的无限级分类,支持输出树状图
无平台限制
只需要告知id,parentid,name即可
<?php error_reporting(E_ALL^E_NOTICE); classTree { /** +------------------------------------------------ *生成树型结构所需要的2维数组 +------------------------------------------------ *@authorabc +------------------------------------------------ *@varArray */ var$arr=array(); /** +------------------------------------------------ *生成树型结构所需修饰符号,可以换成图片 +------------------------------------------------ *@authorabc +------------------------------------------------ *@varArray */ var$icon=array('│','├','└'); /** *@accessprivate */ var$ret=''; /** *构造函数,初始化类 *@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'=>'三级栏目二') *) */ functiontree($arr=array()) { $this->arr=$arr; $this->ret=''; returnis_array($arr); } /** *得到父级数组 *@paramint *@returnarray */ functionget_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 */ functionget_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; } /** *得到当前位置数组 *@paramint *@returnarray */ functionget_pos($myid,&$newarr) { $a=array(); if(!isset($this->arr[$myid]))returnfalse; $newarr[]=$this->arr[$myid]; $pid=$this->arr[$myid]['parentid']; if(isset($this->arr[$pid])) { $this->get_pos($pid,$newarr); } if(is_array($newarr)) { krsort($newarr); foreach($newarras$v) { $a[$v['id']]=$v; } } return$a; } /** *------------------------------------- *得到树型结构 *------------------------------------- *@authorabc *@param$myid表示获得这个ID下的所有子级 *@param$str生成树形结构基本代码,例如:"<optionvalue=\$id\$select>\$spacer\$name</option>" *@param$sid被选中的ID,比如在做树形下拉框的时候需要用到 *@param$adds *@param$str_group */ functionget_tree($myid,$str,$sid=0,$adds='',$str_group='') { $number=1; $child=$this->get_child($myid); if(is_array($child)){ $total=count($child); foreach($childas$id=>$a){ $j=$k=''; if($number==$total){ $j.=$this->icon[2]; }else{ $j.=$this->icon[1]; $k=$adds?$this->icon[0]:''; } $spacer=$adds?$adds.$j:''; $selected=$id==$sid?'selected':''; @extract($a); $parentid==0&&$str_group?eval("\$nstr=\"$str_group\";"):eval("\$nstr=\"$str\";"); $this->ret.=$nstr; $this->get_tree($id,$str,$sid,$adds.$k.' ',$str_group); $number++; } } return$this->ret; } /** *同上一方法类似,但允许多选 */ functionget_tree_multi($myid,$str,$sid=0,$adds='') { $number=1; $child=$this->get_child($myid); if(is_array($child)) { $total=count($child); foreach($childas$id=>$a) { $j=$k=''; if($number==$total) { $j.=$this->icon[2]; } else { $j.=$this->icon[1]; $k=$adds?$this->icon[0]:''; } $spacer=$adds?$adds.$j:''; $selected=$this->have($sid,$id)?'selected':''; @extract($a); eval("\$nstr=\"$str\";"); $this->ret.=$nstr; $this->get_tree_multi($id,$str,$sid,$adds.$k.' '); $number++; } } return$this->ret; } functionhave($list,$item){ return(strpos(',,'.$list.',',','.$item.',')); } /** +------------------------------------------------ *格式化数组 +------------------------------------------------ *@authorabc +------------------------------------------------ */ functiongetArray($myid=0,$sid=0,$adds='') { $number=1; $child=$this->get_child($myid); if(is_array($child)){ $total=count($child); foreach($childas$id=>$a){ $j=$k=''; if($number==$total){ $j.=$this->icon[2]; }else{ $j.=$this->icon[1]; $k=$adds?$this->icon[0]:''; } $spacer=$adds?$adds.$j:''; @extract($a); $a['name']=$spacer.''.$a['name']; $this->ret[$a['id']]=$a; $fd=$adds.$k.' '; $this->getArray($id,$sid,$fd); $number++; } } return$this->ret; } } $data=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'=>''), 8=>array('id'=>'8','parentid'=>3,'name'=>'三级栏目三'), 9=>array('id'=>'9','parentid'=>7,'name'=>'四级分类三'), ); $tree=newTree; $tree->tree($data); //如果使用数组,请使用getArray方法 //$tree->getArray(); //下拉菜单选项使用get_tree方法 $html='<selectname="tree">'; $str="<optionvalue=\$id\$select>\$spacer\$name</option>"; $html.=$tree->get_tree(0,$str,-1).'</select>'; echo$html; ?>