無限級(jí)分類
是一種很常見,很必須的功能,幾乎每個(gè)項(xiàng)目都有。
應(yīng)用場(chǎng)景:下拉列表,樹型列表等
無限級(jí)分類的類型前端實(shí)現(xiàn)(前端框架一般已經(jīng)實(shí)現(xiàn)好了,只要后端按照指定格式傳數(shù)據(jù)給前端就可以生成了)
后端實(shí)現(xiàn)(下面主要講這種實(shí)現(xiàn))
無限級(jí)多種實(shí)現(xiàn)第一種(推薦)
function infiniteSort($data, $showFName, $titleFName, $pidFName = "pid", $idFName = "id", $levelFName = "level", $pid = 0, $level = 0) { $tree = array(); foreach ($data as $key => $value) { if ($value[$pidFName] == $pid) { $value[$levelFName] = $level; $value[$showFName] = str_repeat(" ", $level) . "|-" . $value[$titleFName]; $tree[] = $value; unset($data[$key]); $tempArr = infiniteSort($data, $showFName, $titleFName, $pidFName, $idFName, $level, $value[$idFName], $level + 1); if(!empty($tempArr)){ $tree = array_merge($tree, $tempArr); } } } return $tree; }
注意:
1、$data 已經(jīng)asc排序過的所有數(shù)據(jù)
2、$showFName 顯示名字的字段名(格式化過的)
3、$titleFName 標(biāo)題的字段名(無格式化)
4、$levelFName 層級(jí)字段名
5、$pidFName 父id的字段名
6、$idFName id的字段名
第二種(使用引用變量)
/** * 無限級(jí)分類 * @param Array $treeList //接受處理完成數(shù)據(jù)的數(shù)組 * @param Array $data //數(shù)據(jù)庫里獲取的結(jié)果集 * @param String $level //格式化層級(jí)字段名 * @param Int $pid * @param Int $count //第幾級(jí)分類 */ function tree(&$treeList, &$data, $level, $show_name, $field_name, $field_pid = "pid", $field_id = "id", $pid = 0, $count = 0) { foreach ($data as $key => $value) { if ($value[$field_pid] == $pid) { $value[$level] = $count; $value[$show_name] = str_repeat(" ",$count)."|-".$value[$field_name]; $treeList[] = $value; unset($data[$key]); tree($treeList, $data, $level, $show_name, $field_name,$field_pid, $field_id, $value[$field_id], $count+1); } } }
注意:
1、$data 已經(jīng)asc排序過的所有數(shù)據(jù)
2、返回的無限級(jí)列表數(shù)據(jù)都存在$treeList里面
第三種(使用靜態(tài)變量有限制:如果一次請(qǐng)求調(diào)用兩次來實(shí)現(xiàn)2個(gè)無限級(jí)分類就會(huì)出現(xiàn)問題,所以不推薦)
public function getTree($list, $parent_id, $level=0) { //應(yīng)該是靜態(tài)的局部變量,這樣才能保證,在遞歸調(diào)用時(shí),所有 //的getTree方法,操作的是一個(gè)Tree空間。 static $tree = array();//保存找到的分類的數(shù)組 //遍歷所有分類,通過parent_id判斷,哪些是我們正在查找的 foreach($list as $row) { //判斷當(dāng)前所遍歷的分類$row, 是否是當(dāng)前需要查找的子分類 if($row["pid"] == $parent_id) { //找到了一個(gè)分類 //存起來,存哪? $row["level"] = $level; $tree[] = $row; //繼續(xù)查找當(dāng)前$row所代表的分類的子分類 $this->getTree($list, $row["id"], $level+1); } } return $tree; }
注意:
1、$list 已經(jīng)asc排序過的所有數(shù)據(jù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22324.html
摘要:我們?cè)谛陆ㄒ粋€(gè)刪除前的鉤子函數(shù),再利用遞歸方法實(shí)現(xiàn)子欄目的刪除。最后我們刪除把鉤子函數(shù)恢復(fù)到原始狀態(tài)在瀏覽器中輸入,然后點(diǎn)擊美國一欄中的刪除,此時(shí)會(huì)同時(shí)刪除美國下的紐約。至此,無限級(jí)分類的刪除功能操作完畢。 在此現(xiàn)更正一下之前的預(yù)告,之前忘記了先應(yīng)該把無限級(jí)分類欄目列表功能做完,也就是刪除功能還沒做,所以今天我們先做刪除,下一節(jié)再做面包屑導(dǎo)航。非常抱歉。 同時(shí),不知道是什么原因,上一節(jié)...
摘要:可以看到,我們首先獲取到了所有的數(shù)據(jù),然后按照父級(jí)歸類。無限嵌套評(píng)論先來看下這個(gè)無限嵌套評(píng)論長什么樣子。文件掃描使用遞歸進(jìn)行目錄文件的掃描的栗子。 回顧 上一篇文章我們講到實(shí)戰(zhàn)PHP數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之遞歸。來回顧下什么是遞歸? 一般來說,遞歸被稱為函數(shù)自身的調(diào)用。 遞歸在開發(fā)中的實(shí)際運(yùn)用 N級(jí)分類 無限級(jí)的分類在平常的開發(fā)中是常見的需求,并且在不少面試題中都會(huì)碰到。不管你做什么項(xiàng)目,應(yīng)該都...
摘要:可以看到,我們首先獲取到了所有的數(shù)據(jù),然后按照父級(jí)歸類。無限嵌套評(píng)論先來看下這個(gè)無限嵌套評(píng)論長什么樣子。文件掃描使用遞歸進(jìn)行目錄文件的掃描的栗子。 回顧 上一篇文章我們講到實(shí)戰(zhàn)PHP數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之遞歸。來回顧下什么是遞歸? 一般來說,遞歸被稱為函數(shù)自身的調(diào)用。 遞歸在開發(fā)中的實(shí)際運(yùn)用 N級(jí)分類 無限級(jí)的分類在平常的開發(fā)中是常見的需求,并且在不少面試題中都會(huì)碰到。不管你做什么項(xiàng)目,應(yīng)該都...
摘要:有這樣一個(gè)表,是分類的,是分類名稱,是上級(jí)分類的?,F(xiàn)在有個(gè)分類,程序要找到它上級(jí)的上級(jí)的上級(jí)分類的,簡(jiǎn)單說就是找出頂級(jí)分類的。比如新鮮水果的是,對(duì)應(yīng)父類是,而的父是,沒有父類,也就是頂級(jí)分類了。 有這樣一個(gè)表,id是分類的ID,name是分類名稱,pid是上級(jí)分類的ID。showImg(https://segmentfault.com/img/bVtnrg); 現(xiàn)在有個(gè)分類ID,程序要...
閱讀 2962·2021-10-18 13:33
閱讀 846·2019-08-30 14:20
閱讀 2633·2019-08-30 13:14
閱讀 2524·2019-08-29 18:38
閱讀 2892·2019-08-29 16:44
閱讀 1216·2019-08-29 15:23
閱讀 3491·2019-08-29 13:28
閱讀 1918·2019-08-28 18:00