亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php 無限分類遞歸及其排序詳細解讀

2019-11-06 07:35:32
字體:
來源:轉載
供稿:網友

在各種欄目以及分類設置中,無限分類經常會被用到,而無限分類在進行排序的時候必然要用到遞歸,這里進行一次詳細的分析解讀。

首先我們先了解一下遞歸函數:

遞歸函數在語言學習的時候會單獨拿出來學習,因為它非常常用,本質上來講遞歸函數就是調用自己的函數。

舉個例子:

<?phpfunction test(){	static $a=0;	if($a<10){		$a++;		test();	}	echo $a."<br/>";}test();

test函數里面又再調用了自身,這就是俗稱的遞歸函數!遞歸函數都有條件設置,不然的會無限循環下去,這樣會導致程序奔潰。

所以一般來講我總結遞歸函數有兩個特點:

一個是記錄條件值,記錄的條件值必須保證不會再下一次調用時丟失。

test函數里$a便是記錄條件值,它是依靠使用static關鍵字來保證記錄每次增加的數值不會再下一次調用test()函數而丟失,因為函數中static修飾的變量僅僅在第一次初始化,并保留變量值。所以只要保證這一點,不光static,其他的方式也可以達到目的,例如global還有&修飾符。

另一個是條件檢查。test里面對$a大小的限制就是該條件的檢查過程。

test函數中if($a<10)就是這個條件檢查的過程,它限制了test()函數對自身的調用,這樣就可以防止無限調用導致程序奔潰。

函數a內部調用另外的函數b,如果b函數沒有完成,那么a函數就會一直等待下去,直到b函數完成,才會回到a函數繼續執行。遞歸的過程中利用了這個特性,正是這個能幫助我們對無限分類進行排序,用上面test()遞歸函數說明:

上面test()打印出來的結果是:

10,10,10,10,10,10,10,10,10,10,10

可能和很多人想的不一樣,大概有許多人會覺得不應該是0,1,2,3,4,5,6,7,8,9,10這樣的結果嗎?

這是因為函數test調用過程中,只要$a<10,就會調用自身的test(),每次調用的test()都沒有到達echo處,也就是每次調用的test函數并沒有完結,直到$a遞增到了10,才第一次echo $a,這個時候$a已經是10了,因此第一個10實際是遞歸了11次后的$a,第十一次遞歸的test由于不符合<10的條件該函數完結,這個時候才開始回到遞歸第十次test函數里執行echo,這個時候由于$a是靜態變量,值已經是10了,因此echo出的結果是10,下面依次回到之前的test函數完成前面未完成的echo步驟,因此echo出11個10,最后一個10實際是第一次執行test函數的echo結果。

無限分類的排序完成也是用的這個原理,遞歸排序函數不斷的通過parentid等于上一級id的子類來匹配該類別的子類別,只要找到第一個子類,就用找到的這個子類的id去找下一級的子類,直到沒有更下級的子類的時候,才返回上一級接著繼續找,找到后又開始尋找該子類下一級子類,直到沒有為止才返回,這個過程不斷循環。可能用文字不太能理解,下面的實例中我會畫出圖例,請先往后看。

我們先來看無限分類的數據er圖:

例如一個裙子的類目,它有父類別女裝,女裝又屬于衣服的類目,假定裙子的id為3,女裝為2,衣服為1,那么裙子的parentid就是直接的上級類目裙子的id,因此parentid=2,而child是裙子所在的樹形結構上全部的祖先元素id,那么child應該是1,2,3,因此裙子的深度deep為3,這里我假設的是用,隔開,也可以用其他的符號隔開,title不用說就是裙子。

具體我們來看這個樹形結構:

從樹形結構分類還可以繼續延伸下去,上一級的id是下一級的parentid,就是通過id和parent這兩個列來實現基本的無限分類的,再進行無限分類的遞歸排序的時候也是依靠這兩個字段的關系。

下面是一個無限分類的表結構以及數據的例子:

為了更清楚下面畫了樹形圖:

上一代的類別的id就是自身的parentid,最高一級的parentid則為0,這點非常重要,是無限分類的排序的依據。

我們所要的無限分類排序效果應該是各欄目下的子欄目都放到該欄目下方,用id進行排序,我們要的效果就是下面這樣,為了方便查看我用了tab以及|——來間隔區分欄目之間的關系:

衣服

|——男裝

|——休閑上衣

|——短袖

|——長袖

|——休閑褲

|——女裝

|——女裝上衣

|——女裝下裝

|——牛仔褲

|——裙子

由于類別可以無限延伸下去,所以這里明顯我們需要使用遞歸函數進行排序分類。

獲取數據所有結果,并按id排序

$MySQLi=new mysqli('localhost','root','root','test')or die("連接失敗");$mysqli->set_charset("utf8");$re=$mysqli->query("select * from col order by id asc");$result=$re->fetch_all(MYSQLI_ASSOC);

遞歸排序函數

function recursion($result,$parentid=0){	/*記錄排序后的類別數組*/	static $list=array();	foreach ($result as $k => $v){    	if($v['parentid']==$parentid){    		/*將該類別的數據放入list中*/    		$list[]=$v;    		recursion($result,$v['id']);    	}   	}   	return $list;}這個時候我們就能得到按類別排序好的數組了,但是如果要有相應的格式,例如上面的|——,就需要對函數進行改進。

function recursion($result,$parentid=0,$format="|--"){	/*記錄排序后的類別數組*/	static $list=array();	foreach ($result as $k => $v){    	if($v['parentid']==$parentid){    		if($parentid!=0){    			$v['title']=$format.$v['title'];    		}    		/*將該類別的數據放入list中*/    		$list[]=$v;    		recursion($result,$v['id'],"  ".$format);    	}   	}   	return $list;}$list=recursion($result,0,'|--');這樣排序的結果如下:

整個遞歸函數的執行情況大概是什么樣的,我們接上面說過的要畫的實例圖,看圖后就很清楚這個原理了,這個圖只畫了部分,不過足夠理解這個過程了:


上一篇:PHP的運行模式

下一篇:PHP數組常用函數

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本久久久a级免费| 不卡av电影在线观看| 中文字幕日韩欧美在线| 欧美做受高潮1| 精品国产网站地址| xxxxx成人.com| 日韩网站免费观看| 欧美日韩人人澡狠狠躁视频| 98精品国产自产在线观看| 欧美一级大片在线观看| 亚洲激情自拍图| 国产欧美在线视频| 久久精品成人欧美大片| 欧洲亚洲在线视频| 亚洲欧美一区二区三区久久| 97精品视频在线播放| 久久精品视频在线播放| 中文字幕一区二区三区电影| 亚洲成在人线av| 国产视频精品一区二区三区| 国产亚洲精品一区二555| 亚洲最大在线视频| 精品久久久在线观看| 国产精品一区二区久久久| 亚洲另类激情图| 日韩在线视频观看正片免费网站| 日韩高清电影免费观看完整版| 国产精品91一区| 国产日本欧美一区二区三区| 精品久久久久久久久中文字幕| 国产精品一区二区女厕厕| 夜夜躁日日躁狠狠久久88av| 亚洲精品短视频| 26uuu国产精品视频| 亚洲肉体裸体xxxx137| 亚洲精品成人久久| 国产精品白嫩初高中害羞小美女| 久久久91精品| 精品久久久久久久久久久久久久| 亚洲电影免费观看高清完整版在线观看| 久久亚洲精品中文字幕冲田杏梨| 色综合影院在线| 日韩欧美在线视频日韩欧美在线视频| 久久精品久久久久电影| 欧美国产极速在线| 日韩美女视频免费在线观看| 精品国产老师黑色丝袜高跟鞋| 亚洲精品少妇网址| 国产精品视频一区二区高潮| 成人久久久久久久| 中文亚洲视频在线| 亚洲男女性事视频| 日韩av在线网页| 亚洲一区二区三区成人在线视频精品| 国产成人精品一区二区三区| 国产小视频91| 欧美最猛性xxxxx免费| 国产一区二区美女视频| 欧美最猛黑人xxxx黑人猛叫黄| 人人澡人人澡人人看欧美| 亚洲午夜激情免费视频| 亚洲欧美国产精品专区久久| 国产精品久久久久久网站| 日韩中文字幕第一页| 亚洲欧美国产精品久久久久久久| 91精品国产综合久久香蕉最新版| 欧美日韩精品二区| 国模gogo一区二区大胆私拍| 久久久精品在线| 国产精品福利无圣光在线一区| 欧美有码在线观看视频| 亚洲电影免费观看高清完整版在线| 欧美成人激情图片网| 欧美另类高清videos| 日韩欧美在线看| 久久99久久亚洲国产| 秋霞av国产精品一区| 亚洲大胆人体在线| 日韩精品久久久久久福利| 97视频在线观看免费| 国产精品视频精品| 亚洲成人黄色在线观看| 亚洲精品wwwww| 久久香蕉国产线看观看av| 91中文字幕在线观看| 欧美激情久久久| 茄子视频成人在线| 欧美性视频在线| 久久久最新网址| 亚洲午夜久久久影院| 久久久亚洲福利精品午夜| 亚洲日本欧美中文幕| 中文字幕日韩欧美在线视频| 亚洲午夜久久久久久久| 国产精品爽爽ⅴa在线观看| 亚洲大胆人体视频| 久久6免费高清热精品| 久热精品视频在线| 最近2019中文免费高清视频观看www99| 国产欧美日韩精品专区| 欧美大奶子在线| 亚洲欧美日韩国产成人| 91精品在线播放| 亚洲免费视频网站| 成人免费xxxxx在线观看| 亚洲欧美精品在线| 日韩av影视在线| 国产成人avxxxxx在线看| 亚洲男人天堂视频| 国产suv精品一区二区三区88区| 中文字幕久热精品视频在线| 日韩久久免费电影| 91干在线观看| 亚洲电影成人av99爱色| 久久久免费观看| 日韩欧美国产网站| 国产精品久久久久久久电影| 国产不卡精品视男人的天堂| 在线免费看av不卡| 久久99久久99精品免观看粉嫩| 国产精品久久久久久av下载红粉| 中文字幕精品一区久久久久| 欧美一区亚洲一区| 国产一区二区黑人欧美xxxx| 日韩精品免费综合视频在线播放| 日本欧美爱爱爱| 欧美大片免费观看| 亚洲的天堂在线中文字幕| 国产欧美久久一区二区| 国a精品视频大全| 久久91精品国产91久久久| 亚洲最大福利视频网站| 国产精品免费在线免费| 国产一区二区三区网站| 精品国产31久久久久久| 国产在线高清精品| 国产欧美日韩亚洲精品| 中文在线资源观看视频网站免费不卡| 成人免费视频97| 97超级碰碰人国产在线观看| 国产精品免费视频久久久| 日本道色综合久久影院| 亚洲欧美中文另类| 久久精品最新地址| 日本精品久久电影| 日韩av一区二区在线观看| 亚洲国产精品va在看黑人| 久久精品免费播放| 国产精品露脸自拍| 国产精品久久97| 国产深夜精品福利| 亚洲天堂视频在线观看| 欧美激情区在线播放| 国产精品91久久久| 97人洗澡人人免费公开视频碰碰碰| 亚洲区bt下载| 57pao成人国产永久免费| 欧美性受xxx| 亚洲国产精品va在线| 日韩av免费在线| 一本一道久久a久久精品逆3p| 日韩视频第一页| 欧美成人午夜剧场免费观看| 欧美在线观看视频|