当前位置:首页 > PHP教程 > php应用 > 列表

php+mysql实现无限级分类

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-26 14:33:27 浏览: 评论:0 

这篇文章主要介绍了php+mysql实现无限级分类,一个php项目需要用到分类,动手制作了一个php无限极分类,感兴趣的小伙伴们可以参考一下。

项目思路分析:一个PHP项目要用到分类,但不确定分几级,所以就想做成无限级分类。

一开始想是按以前一样,数据库建4个值,如下:

id: 自增   |   pid: 父类ID   |  xid: 排序ID   |  classname: 分类名称

后来想到这种在读取数据时和修改时比较不方便,而且在产品读取时尤其不便,于时改成了以下的方案:

在Mysql的表中新增了一个字段,现数据库如下:

表名 w_faqclass:   id: 自增   |   pid: 父类ID   |  xid: 排序ID   |  classname: 分类名称  |  rank:  等级

定义:

一级分类,pid 为 0 ,rank 为"/"

二级分类,pid 为 一级分类的id,rank 为"/一级分类的id/"

三级分类,pid 为 二级分类的id,rank 为"/一级分类的id/二级分类的id/"

依此类推...

1. 基础函数   

利于递归返回已经进行了排序的无限级分类的数组,不想用递归的话也可以用 like 来获取后再进行排序,我比较懒,就不写那种获取方式了,其实用 like 更好,推荐用那种方式。

  1. $datatable    : 数据表名 
  2. $startid    : 开始父类ID 
  3. $wheretColumns  :父类列名 
  4. $xColumns    : 排序列名 
  5. $xtype      : 排序方式 
  6. $returnArr    : 返回数组 
  7. */ 
  8. function ReadClass($datatable,$startid,$xtype,$returnArr){ 
  9.   $db    =  $datatable
  10.   $sid  =  $startid
  11.   $xtype  =  $xtype
  12.   $lu    =  $returnArr
  13.      
  14.   $sql  =  "select * from `".$db."` where `pid`='".$sid."' order by xid ".$xtype.";"
  15.   $cresult=  mysql_query($sql); 
  16.   if(mysql_num_rows($cresult)>0){ 
  17.     while($rs = mysql_fetch_array($cresult)){ 
  18.       $lunum = count($lu); 
  19.       $lu[$lunum]['id']    =  $rs['id']; 
  20.       $lu[$lunum]['pid']    =  $rs['pid']; 
  21.       $lu[$lunum]['rank']    =  $rs['rank']; 
  22.       $lu[$lunum]['classname']=  $rs['classname']; 
  23.       $lu[$lunum]['xid']    =  $rs['xid']; 
  24.          
  25.       $lu            =  ReadClass($db,$rs['id'],$xtype,$lu); 
  26.     } 
  27.   } 
  28.   return $lu
  29. /* 

查询某表中的某个值,只会返回一个值

  1. $datatable    : 数据表名 
  2. $wherevalue    : 条件值 
  3. $selectColumns  : 查询列名 
  4. $whereColumns  : 条件列 
  5. */ 
  6. function SelectValue($datatable,$wherevalue,$selectColumns,$whereColumns){ 
  7.   $sql  =  "select `".$selectColumns."` from `".$datatable."` where `".$whereColumns."`='".$wherevalue."';"
  8.   $result  =  mysql_query($sql); 
  9.   while($rs = mysql_fetch_array($result)){ 
  10.     return $rs[$selectColumns]; 
  11.   } 

2. 增加分类 (直接做到了select中用于选择 )    

  1. <?php 
  2.   $classArr = ReadClass('w_faqclass','0','asc',array()); 
  3.   $canum = count($classArr); 
  4.      
  5.   echo "<select name='pid'>"
  6.   echo "<option value='0'>主分类</option>"
  7.   for($i=0; $i<$canum$i++){ 
  8.     $rankArr = split("/",$classArr[$i]['rank']); 
  9.     $ranknum = count($rankArr); 
  10.     $t = ""
  11.     for($j=1; $j<$ranknum$j++){ //用于格式化显示子类 
  12.       $t .= "├┄┄"
  13.     } 
  14.     echo "<option value='".$classArr[$i]['id']."'>".$t.$classArr[$i]['classname']."</option>"
  15.   } 
  16.   echo "</select>" 
  17. ?> 

保存时的操作,需要判断是否为主分类,当为主类时,rank 值设为,查询父类的 rank 值,用父类的 rank 加上 父类的 id 值:

  1. if($pid != 0){ 
  2.   $pidrank = SelectValue('w_faqclass',$pid,'rank','id');  
  3.   $rank = $pidrank.$pid."/"
  4. }else
  5.   $rank = "/";   

3. 修改分类

  1. <?php 
  2.   /* 
  3.   注意,因为是修改,在此页面加载时已将当前分类的所有值读出来了,对应是:$pid,$rank 
  4.   */ 
  5.   $classArr = ReadClass('w_faqclass','0','asc',array()); 
  6.   $canum = count($classArr); 
  7.   echo "<select name='pid'>"
  8.   echo "<option value='0'>主分类</option>"
  9.    
  10.   for($i=0; $i<$canum$i++){ 
  11.     // 因为是修改,所以当前分类不能选择自身或自身以下的分类,多加个 rank 值的优势啊,哈哈,以前做单pid值的时候这里还得用次递归查询 
  12.     while($ids == $classArr[$i]['id'] || strstr($classArr[$i]['rank'],$rank.$ids."/")){ 
  13.       $i++; 
  14.     } 
  15.        
  16.     $rankArr = split("/",$classArr[$i]['rank']); 
  17.     $ranknum = count($rankArr); 
  18.     $t = ""
  19.     for($j=1; $j<$ranknum$j++){ 
  20.       $t .= "├┄┄"
  21.     } 
  22.     if($pid == $classArr[$i]['id']){ 
  23.       $selected = "selected";   
  24.     }else
  25.       $selected = ""
  26.     } 
  27.     echo "<option value='".$classArr[$i]['id']."' ".$selected.">".$t.$classArr[$i]['classname']."</option>"
  28.   } 
  29.   echo "</select>" 
  30. ?> 

保存时的操作

要做到改动时该分类的所有子分类rank值都需要变动,选取得原来子分类通用到的 rank 值,也就是该分类的 rank值加上它的ID值,利于 mysql 的REPLACE语句进行替换。

  1. if($pid != 0){ 
  2.   $pidrank = SelectValue('w_faqclass',$pid,'rank','id'); 
  3.   $rank = $pidrank.$pid."/"
  4. }else
  5.   $rank = "/";   
  6. $orank = SelectValue('w_faqclass',$ids,'rank','id').$ids."/"
  7. $nrank = $rank.$ids."/"
  8.      
  9. mysql_query("UPDATE `w_faqclass` SET rank = REPLACE(rank,'".$orank."','".$nrank."');"); 
  10. mysql_query("UPDATE `w_faqclass` SET `classname`='".$classname."',`xid`='".$xid."',`pid`='".$pid."',`rank`='".$rank."' where `id`='".$ids."';"); 

4. 删除和查询就简单了,这个就不赘述了,提到一点,记得在删除前确认下该类下面是否存在子类就可以了。

  1. $zid = SelectValue('w_faqclass',$ids,'id','pid'); 
  2.    
  3. if($zid>0){ 
  4.   ... 

以上就是php+mysql实现无限极分类的方法,希望对大家的学习有所帮助。

Tags: php+mysql无限级分类

分享到: