一個(gè)PHP項(xiàng)目要用到分類,但不確認(rèn)是4級(jí)還是需要用到5級(jí),想著干脆做成無(wú)限級(jí)分類好了。
一開(kāi)始想是按以前一樣,數(shù)據(jù)庫(kù)建4個(gè)值,如下:
id:?自增???|???pid:?父類ID???|??xid:?排序ID???|??classname:?分類名稱
后來(lái)想到這種在讀取數(shù)據(jù)時(shí)和修改時(shí)比較不方便,而且在產(chǎn)品讀取時(shí)尤其不便,于時(shí)改成了以下的方案:
在Mysql的表中新增了一個(gè)字段,現(xiàn)數(shù)據(jù)庫(kù)如下:
表名?w_faqclass:???id:?自增???|???pid:?父類ID???|??xid:?排序ID???|??classname:?分類名稱??|??rank:??等級(jí)
定義:
一級(jí)分類,pid?為?0?,rank?為"/"
二級(jí)分類,pid?為?一級(jí)分類的id,rank?為"/一級(jí)分類的id/"
三級(jí)分類,pid?為?二級(jí)分類的id,rank?為"/一級(jí)分類的id/二級(jí)分類的id/"
依此類推...
1.基礎(chǔ)函數(shù)
/* 利于遞歸返回已經(jīng)進(jìn)行了排序的無(wú)限級(jí)分類的數(shù)組 不想用遞歸的話也可以用 like 來(lái)獲取后再進(jìn)行排序,我比較懶,就不寫(xiě)那種獲取方式了,其實(shí)用 like 更好,推薦用那種方式 $datatable : 數(shù)據(jù)表名 $startid : 開(kāi)始父類ID $wheretColumns :父類列名 $xColumns : 排序列名 $xtype : 排序方式 $returnArr : 返回?cái)?shù)組 */ function ReadClass($datatable,$startid,$xtype,$returnArr){ $db = $datatable; $sid = $startid; $xtype = $xtype; $lu = $returnArr; $sql = "select * from `".$db."` where `pid`='".$sid."' order by xid ".$xtype.";"; $cresult= mysql_query($sql); if(mysql_num_rows($cresult)>0){ while($rs = mysql_fetch_array($cresult)){ $lunum = count($lu); $lu[$lunum]['id'] = $rs['id']; $lu[$lunum]['pid'] = $rs['pid']; $lu[$lunum]['rank'] = $rs['rank']; $lu[$lunum]['classname']= $rs['classname']; $lu[$lunum]['xid'] = $rs['xid']; $lu = ReadClass($db,$rs['id'],$xtype,$lu); } } return $lu; } /* 查詢某表中的某個(gè)值,只會(huì)返回一個(gè)值 $datatable : 數(shù)據(jù)表名 $wherevalue : 條件值 $selectColumns : 查詢列名 $whereColumns : 條件列 */ function SelectValue($datatable,$wherevalue,$selectColumns,$whereColumns){ $sql = "select `".$selectColumns."` from `".$datatable."` where `".$whereColumns."`='".$wherevalue."';"; $result = mysql_query($sql); while($rs = mysql_fetch_array($result)){ return $rs[$selectColumns]; } }
2.增加分類
<?php $classArr = ReadClass('w_faqclass','0','asc',array()); $canum = count($classArr); echo "<select name='pid'>"; echo "<option value='0'>主分類</option>"; for($i=0; $i<$canum; $i++){ $rankArr = split("/",$classArr[$i]['rank']); $ranknum = count($rankArr); $t = ""; for($j=1; $j<$ranknum; $j++){ //用于格式化顯示子類 $t .= "├┄┄"; } echo "<option value='".$classArr[$i]['id']."'>".$t.$classArr[$i]['classname']."</option>"; } echo "</select>" ?> //保存時(shí)的操作,需要判斷是否為主分類,當(dāng)為主類時(shí), rank 值設(shè)為 / //查詢父類的 rank 值,用父類的 rank 加上 父類的 id 值 if($pid != 0){ $pidrank = SelectValue('w_faqclass',$pid,'rank','id'); $rank = $pidrank.$pid."/"; }else{ $rank = "/"; }
3.修改分類
<?php /* 注意,因?yàn)槭切薷?,在此?yè)面加載時(shí)已將當(dāng)前分類的所有值讀出來(lái)了,對(duì)應(yīng)是:$pid,$rank */ $classArr = ReadClass('w_faqclass','0','asc',array()); $canum = count($classArr); echo "<select name='pid'>"; echo "<option value='0'>主分類</option>"; for($i=0; $i<$canum; $i++){ // 因?yàn)槭切薷?,所以?dāng)前分類不能選擇自身或自身以下的分類,多加個(gè) rank 值的優(yōu)勢(shì)啊,哈哈,以前做單pid值的時(shí)候這里還得用次遞歸查詢 while($ids == $classArr[$i]['id'] || strstr($classArr[$i]['rank'],$rank.$ids."/")){ $i++; } $rankArr = split("/",$classArr[$i]['rank']); $ranknum = count($rankArr); $t = ""; for($j=1; $j<$ranknum; $j++){ $t .= "├┄┄"; } if($pid == $classArr[$i]['id']){ $selected = "selected"; }else{ $selected = ""; } echo "<option value='".$classArr[$i]['id']."' ".$selected.">".$t.$classArr[$i]['classname']."</option>"; } echo "</select>" ?> // 保存時(shí)的操作 // 要做到改動(dòng)時(shí)該分類的所有子分類rank值都需要變動(dòng),選取得原來(lái)子分類通用到的 rank 值,也就是該分類的 rank值加上它的ID值 // 利于 mysql 的REPLACE語(yǔ)句進(jìn)行替換 if($pid != 0){ $pidrank = SelectValue('w_faqclass',$pid,'rank','id'); $rank = $pidrank.$pid."/"; }else{ $rank = "/"; } $orank = SelectValue('w_faqclass',$ids,'rank','id').$ids."/"; $nrank = $rank.$ids."/"; mysql_query("UPDATE `w_faqclass` SET rank = REPLACE(rank,'".$orank."','".$nrank."');"); mysql_query("UPDATE `w_faqclass` SET `classname`='".$classname."',`xid`='".$xid."',`pid`='".$pid."',`rank`='".$rank."' where `id`='".$ids."';");
4.刪除和查詢
$zid = SelectValue('w_faqclass',$ids,'id','pid'); if($zid>0){ ... }

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)
