什么是PHP無限分類?就像windows下新建一個(gè)文件夾,在新建的文件夾下又可以新建一個(gè)文件夾,這樣無限循環(huán)下去,無限分類也是這樣,父類可以分出它子類,子類又可以分出它的子類,這樣一直無限循環(huán)下去,假設(shè)有這樣的一個(gè)三級(jí)分類,新聞→PHP新聞→PHP7出來了。如果我們要查找“PHP7出來了”這條新聞,我們先點(diǎn)擊新聞,然后再點(diǎn)擊PHP新聞就可以查出來了,也就是說我們可以通過祖父類一級(jí)一級(jí)地往下找,反過來我們只要知道一個(gè)子類的父類,就可以把它查找出來了。這樣我們?cè)谠O(shè)計(jì)數(shù)據(jù)庫時(shí)就可以多設(shè)計(jì)一個(gè)父類id的字段就可以實(shí)現(xiàn)PHP無限分類的功能了。
無限級(jí)分類原理簡(jiǎn)介
無限分類看似"高大上",實(shí)際上原理是非常簡(jiǎn)單的 。無限分類不僅僅需要代碼的巧妙性,也要依托數(shù)據(jù)庫設(shè)計(jì)的合理性。要滿足無限級(jí)分類,數(shù)據(jù)庫需要有兩個(gè)必須的字段,id,pid。id用來標(biāo)識(shí)自身,而pid則是用來表明父級(jí)id。也就是說,每個(gè)分類記錄不僅描述了自身,還描述了與其關(guān)心最為緊密的另一個(gè)id??此茝?fù)雜的事情被這樣一個(gè)小技巧解決了。
所需PHP文件
conn.php 數(shù)據(jù)庫配置文件
deep.php 遞歸無限極分類文件
deep2.php 導(dǎo)航link式文件
建立數(shù)據(jù)庫表
分類表:命名為deepcate
數(shù)據(jù)庫準(zhǔn)備:
建表deepcate:
CREATE TABLE IF NOT EXISTS `deepcate` ( `id` int(4) NOT NULL, `pid` int(11) NOT NULL, `catename` varchar(30) NOT NULL, `cateorder` int(11) unsigned NOT NULL DEFAULT '0', `createtime` int(10) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='分類表';
導(dǎo)入***數(shù)據(jù):
INSERT INTO `deepcate` (`id`, `pid`, `catename`, `cateorder`, `createtime`) VALUES (1, 0, '新聞', 0, 0), (2, 0, '圖***', 0, 0), (3, 1, '國內(nèi)新聞', 0, 0), (4, 1, '國際新聞', 0, 0), (5, 3, '北京新聞', 0, 0), (6, 4, '美國新聞', 0, 0), (7, 2, '美女圖***', 0, 0), (8, 2, '風(fēng)景圖***', 0, 0), (9, 7, '歐美明星', 0, 0), (10, 9, '英國***', 0, 0);
配置連接文件
新建文件conn.php
<?php $db_host='localhost'; $db_user='root'; $db_password = ''; $db_name = ''; $link=@mysqli_connect($db_host,$db_user,$db_password)or die(mysql_error()); mysqli_select_db($link,$db_name)or die(mysqli_error()); mysqli_query("$link,set names utf8")or die('編碼設(shè)置錯(cuò)誤'); ?>
實(shí)現(xiàn)原理圖
下拉列表樣式
<?php include ("conn.php"); //首先定義一個(gè)函數(shù),pid作為父類ID,定義為0 function getList($pid=0,&$result=array(),$space=0){//遞歸在***作是需要返回?cái)?shù)組,我們使用引用的方法,對(duì)代碼進(jìn)行更改 $space=$space+2; $sql="SELECT*FROM deepcate WHERE pid = $pid";//使用sql語句,查詢pid選面的子類。 $res = mysql_query($sql);//把結(jié)果放入數(shù)組中,然后返回到result中。 while ($row = mysql_fetch_assoc($res)){ $row['catename']=str_repeat(' ',$space).'|--|'.$row['catename'];//對(duì)分類的樣式進(jìn)行美化 $result[]=$row; getList($row['id'],$result,$space);//遞歸是函數(shù)自身調(diào)用自身的技巧,我們?cè)诓樵冏宇?nbsp;的 時(shí)候需要調(diào)用到getList($row['id']); }//子類的ID要作為下一級(jí)的ID所以要在后面帶入$row['id']) return $result; } $rs=getList(); function displayCate($pid=0,$selected=1){ $rs=getList($pid); $str=''; $str.="<select name='cate'>"; foreach ($rs as $key=>$val){ $selectedstr=''; if ($val['id'] == $selected){ $selectedstr="selected"; } $str.="<option{$selectedstr}>{$val['catename']}</option>"; } return $str.='</select>'; } echo displayCate(0,2); ?>
要點(diǎn):
遞歸實(shí)現(xiàn)無限級(jí)分類是用利用遞歸方式,找出父節(jié)點(diǎn),生成一個(gè)家譜樹。
子類與父類。
導(dǎo)航LINK樣式
<?php include('conn.php'); function getCatePath($cid, &$result = array()) { /*同下拉樣式相同,創(chuàng)建getCatePath函數(shù),執(zhí)行sql語句查詢id,并把取得的付給$rs. 使用mysql_fetch_assoc來獲取數(shù)組,調(diào)用自身getCatePath把pid和自身的id進(jìn)行查詢。*/ $sql = "SELECT * FROM deepcate WHERE id=$cid"; $rs = mysql_query($sql); $row = mysql_fetch_assoc($rs); if ($row) { $result[] = $row; getCatePath($row['pid'], $result); } krsort($result); //返回$result,使用逆向的方式對(duì)數(shù)組進(jìn)行排序。 return $result; } function displayCatePath($cid,$url='cate.php?cid=') { $res = getCatePath($cid); $str = ''; foreach ($res as $key => $val) { $str.= "<a href={$url}{$val['id']}>{$val['catename']}</a>>"; } return $str; } echo displayCatePath(10); ?>
要點(diǎn):
1.link樣式是從父節(jié)點(diǎn)開始,向下尋找其子孫節(jié)點(diǎn),而形成的一個(gè)樹狀圖形,link樣式判斷的是當(dāng)前節(jié)點(diǎn)的pid與上一個(gè)節(jié)點(diǎn)的id相等.
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)