[CODE:]表menu_cls该表结构如下图:
CREATE TABLE IF NOT EXISTS `menu_cls` (
`id` int(4) NOT NULL auto_increment,
`parent_id` int(4) NOT NULL default '0',
`level` int(4) NOT NULL default '0',
`path` varchar(200) collate utf8_unicode_ci default NULL,
`title` varchar(40) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=29 ;
[CODE:]类Menu_Class.php
<?php
classMenu_Class{
private$menu;
publicfunctionSet_Array($array){
$this->menu=$array;
}
publicfunctionPath_Line($i){ //随便放了几个符号
switch($i){
case1:return'▲';break;
case2:return'★';break;
case3:return'◆';break;
case4:return'●';break;
default:return'→';break;
}
}
publicfunctionPath_Count($int){ //往前放点空格,分开层次
switch($int){
case0:returnstr_repeat(' ',0);break;
default:returnstr_repeat(' ',$int).$this->Path_Line($int);break;
}
}
publicfunctionMenu_Output(){ //显示菜单
$rows=count($this->menu);
$level_max=$this->menu[$rows-1]['level'];
for($i=0;$i<$rows;$i++){
$select.=$this->Path_Count($this->menu[$i]['level']-1).$this->menu[$i]['title'].'</br>';
}
return$select;
}
publicfunctionMenu_Select(){ //下拉菜单
$select='<selectname="parent_id">';
$select.='<optionvalue="0"selected="selected">--根目录--</option>';
$rows=count($this->menu);
for($i=0;$i<$rows;$i++){
$select.='<optionvalue="'.$this->menu[$i]['path'].'">'.$this->Path_Count($this->menu[$i]['level']-1).$this->menu[$i]['title'].'</option>';
}
$select.='</select>';
return$select;
}
publicfunctionPath_Cut($path,$all){//将PATH分解并获取到当前路径,级别,以及父ID
$all_length=count($all);
if($path==0){//如果是根目录的话
if(is_array($all)){//如果已经有N条记录
$cls['path']=$all[$all_length-1]['id']+1;//现在的路径则为表中最后一个记录的ID+1
}else{
$cls['path']=$path+1;//否则从1开始
}
$cls['level']=1;//根目录默认层级为一级
$cls['parent_id']=0;//父ID为0
}else{
$cls['path']=$path.','.($all[$all_length-1]['id']+1);//获取路径为父级路径+此条记录ID
$level_arr=split(',',$path);
$cls['level']=count($level_arr)+1;//获取当前分类级别
$cls['parent_id']=$level_arr[$cls['level']-2];//获取父ID
}
return$cls;
}
}
?>
[CODE:]使用 结果如下:
?<?php
require_once(QuiZ_Path.'../Classes/FileName_Set.php');
$link=newExecSQL(); #SQL操作
$value=newValue_Leach();#值过滤
$menu=newMenu_Class();#菜单生成
if($_POST['Submit']=='提交'){
$link->SetSQL("Select*From".Base::$Menu_Left."orderbyid");
$all=$link->Query_array();
$all_length=count($all);
$cls=$menu->Path_Cut($value->_Post('parent_id'),$all); #值分解成$cls['parent_id'],$cls['level'],$cls['path']
$link->SetSQL("InSertInto".Base::$Menu_Left."(parent_id,level,title,path)values(:parent_id,:level,:title,:path)");
$link->bindParam(":parent_id",$cls['parent_id']);
$link->bindParam(":level",$cls['level']);
$link->bindParam(":title",$value->_Post('title'));
$link->bindParam(":path",$cls['path']);
$link->Query_noreturn();
$link->Inf_right('','add.php');
}
$link->SetSQL("Select*From".Base::$Menu_Left."orderbypath");
$menu->Set_Array($link->Query_array());
$this->assign('menu',$menu->Menu_Output());#使用菜单
Smarty->assign('menu_select',$menu->Menu_Select());#使用下拉菜单
$Smarty->display('add.tpl');
?>
SELECTMENU
刚开始考虑的时候,确实迷糊了.不过想清楚了就变得简单了,嘿嘿
分享到:
相关推荐
PHP无限级分类,非递归.非常好用带数据库!
无限级分类的非递归实现(存储过程版)
SQL Server 存储层级数据实现无限级分类,非递归存储过程无限级分类,左右值分类
分为两种情况,介绍了在递归和不使用递归的情况下PHP实现无限级分类,感兴趣的小伙伴们可以参考一下
这是我从其它的地方下载的一个好的分类程序,大家可以用。有要的人话下载去用吧。
主要介绍了php+mysql不用递归实现的无限级分类实例,重点在不使用递归,需要的朋友可以参考下
网络上很多无限级的分类,但无非是两种,一种是递归算法,一种是非递归算法。。
下面小编就为大家带来一篇PHP不使用递归的无限级分类简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
1、数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类; 2、数据库设计通过特定格式进行排列,然后使用mysql查询关键函数:concat。程序实现比较简单; 3、第三种不是太了解, 好像要...
<?... ... charset=utf-8"); $link = mysql_connect('localhost','root','eric') or die(mysql_error());... }这是一个PHP无限级分裂的实现库,有递归 非递归俩种方法。需要的朋友可以下载使用。
允许多级论坛(子论坛)功能,支持无限级分类 283. 支持将版面作为分类功能,作为分类后的版面将不显示帖子和禁止发表内容 284. 改进在线人数的读取,当网页未下载完成时,提示网页未传输完成. 285. 后台的...