摘要:下面就記錄下我在寫時實(shí)現(xiàn)無限分類的過程。方法是一個遞歸函數(shù)。這邊我自定義了一個遞歸函數(shù)用于獲取該分類下的子分類。具體實(shí)現(xiàn)如下獲取子節(jié)點(diǎn)記錄該分類的深度啟用禁用如果該分類的依舊有子分類則再次遍歷輸出重置分類層級最終效果
最近打算做一個blog,通常每篇文章都有屬于自己的分類。下面就記錄下我在寫blog時實(shí)現(xiàn)無限分類的過程。php框架用的是laravel,根據(jù)注釋也能輕松改成你習(xí)慣的框架。
數(shù)據(jù)表設(shè)計(jì)CREATE TABLE `article_category` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `pid` int(10) unsigned NOT NULL DEFAULT "0" COMMENT "父id", `name` char(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "分類名", `statu` enum("y","n") COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "y" COMMENT "是否顯示", `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `remark` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "", PRIMARY KEY (`id`), KEY `article_category_pid_index` (`pid`) ) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;程序設(shè)計(jì) 添加分類
public function addClassify(Request $request) { // laravel 框架自帶的驗(yàn)證機(jī)制 $this->validate( $request, [ "name" => "required|unique:article_category", "remark" => "max:100", "pid" => "required|numeric" ], [ "name.required" => "請?zhí)顚懛诸惷?, "name.unique" => "改分類名已存在", "remark.max" => "分類簡介不能超過100個字符", "pid.numeric" => "分類id必須為數(shù)字" ] ); // 獲取分類名 $this->_category->name = $request->input("name"); // 獲取分類父id,默認(rèn)是0,為一級分類 $this->_category->pid = $request->input("pid",0); // 分類簡介 $this->_category->remark = $request->input("remark"); // 寫入數(shù)據(jù)庫 $result = $this->_category->save(); // 返回結(jié)果 $result = $result ? "操作成功" : "操作失敗"; return back()->with("act_msg",$result); }獲取分類列表
/** * 加載視圖 * @return [type] [description] */ public function classify() { // 從數(shù)據(jù)庫獲取所有分類記錄 $node = $this->_category->orderBy("id","asc")->get(); // 將分類以及子分類整理排序 $node = $this->_treeNode($node->toArray(),0); // 加載視圖及分配數(shù)據(jù) return view("admin.classify",["list"=>$node]); } /** * 整理排序所有分類 * @param array $data 從數(shù)據(jù)庫獲取的分類 * @param integer $parentId 父id,默認(rèn)一級分類 * @return array */ private function _treeNode($data,$parentId = 0) { // 用于保存整理好的分類節(jié)點(diǎn) $node = []; // 循環(huán)所有分類 foreach ($data as $key => $value) { // 如果當(dāng)前分類的父id等于要尋找的父id則寫入$node數(shù)組,并尋找當(dāng)前分類id下的所有子分類 if($parentId == $value ["pid"]) { $node [$key] = $value; $node [$key] ["childer"] = $this->_treeNode($data,$value ["id"]); } } return $node; }
方法classify是用于從數(shù)據(jù)庫獲取所有分類以及顯示模板。方法_treeNode是一個遞歸函數(shù)。將從數(shù)據(jù)庫獲取的所有分類整理排序。排序好的效果如下圖:
渲染視圖ID | 分類名 | 簡介 | 更新時間 | 發(fā)布狀態(tài) | 操作 | |
---|---|---|---|---|---|---|
{{$val ["id"]}} | {{$val ["name"]}} | {{$val ["remark"]}} | {{$val ["updated_at"]}} | @if($val ["statu"] == "y") 啟用 @else 禁用 @endif | |
渲染視圖時需要判斷該分類下是否有子分類,如果只做到三級分類,此時只需要再來個二層循環(huán)就ok了。這邊我自定義了一個遞歸函數(shù)get_childer_node 用于獲取該分類下的子分類。具體實(shí)現(xiàn)如下:
/** * 獲取子節(jié)點(diǎn) * @param array $data [description] * @return [type] [description] */ function get_childer_node($data = []) { // 記錄該分類的深度 static $callNum = 1; if(empty($data)) return; foreach ($data as $key => $val) { if($val ["statu"] == "y") $isShow = "啟用"; else $isShow = "禁用"; echo <<最終效果{$val ["id"]} |----{$val ["name"]} {$val ["remark"]} {$val ["updated_at"]} $isShow HTML; // 如果該分類的依舊有子分類則再次遍歷輸出 if(!empty($val ["childer"])) { $callNum ++; get_childer_node($val ["childer"]); } // 重置分類層級 $callNum = 1; } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25802.html
無限級分類 是一種很常見,很必須的功能,幾乎每個項(xiàng)目都有。 應(yīng)用場景:下拉列表,樹型列表等 無限級分類的類型 前端實(shí)現(xiàn)(前端框架一般已經(jīng)實(shí)現(xiàn)好了,只要后端按照指定格式傳數(shù)據(jù)給前端就可以生成了) 后端實(shí)現(xiàn)(下面主要講這種實(shí)現(xiàn)) 無限級多種實(shí)現(xiàn) 第一種(推薦) function infiniteSort($data, $showFName, $titleFName, $pidFName = p...
摘要:我們在新建一個刪除前的鉤子函數(shù),再利用遞歸方法實(shí)現(xiàn)子欄目的刪除。最后我們刪除把鉤子函數(shù)恢復(fù)到原始狀態(tài)在瀏覽器中輸入,然后點(diǎn)擊美國一欄中的刪除,此時會同時刪除美國下的紐約。至此,無限級分類的刪除功能操作完畢。 在此現(xiàn)更正一下之前的預(yù)告,之前忘記了先應(yīng)該把無限級分類欄目列表功能做完,也就是刪除功能還沒做,所以今天我們先做刪除,下一節(jié)再做面包屑導(dǎo)航。非常抱歉。 同時,不知道是什么原因,上一節(jié)...
摘要:可以看到,我們首先獲取到了所有的數(shù)據(jù),然后按照父級歸類。無限嵌套評論先來看下這個無限嵌套評論長什么樣子。文件掃描使用遞歸進(jìn)行目錄文件的掃描的栗子。 回顧 上一篇文章我們講到實(shí)戰(zhàn)PHP數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之遞歸。來回顧下什么是遞歸? 一般來說,遞歸被稱為函數(shù)自身的調(diào)用。 遞歸在開發(fā)中的實(shí)際運(yùn)用 N級分類 無限級的分類在平常的開發(fā)中是常見的需求,并且在不少面試題中都會碰到。不管你做什么項(xiàng)目,應(yīng)該都...
摘要:可以看到,我們首先獲取到了所有的數(shù)據(jù),然后按照父級歸類。無限嵌套評論先來看下這個無限嵌套評論長什么樣子。文件掃描使用遞歸進(jìn)行目錄文件的掃描的栗子。 回顧 上一篇文章我們講到實(shí)戰(zhàn)PHP數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之遞歸。來回顧下什么是遞歸? 一般來說,遞歸被稱為函數(shù)自身的調(diào)用。 遞歸在開發(fā)中的實(shí)際運(yùn)用 N級分類 無限級的分類在平常的開發(fā)中是常見的需求,并且在不少面試題中都會碰到。不管你做什么項(xiàng)目,應(yīng)該都...
摘要:本文經(jīng)授權(quán)轉(zhuǎn)自社區(qū)使用嵌套集合模型來實(shí)現(xiàn)模型的無限極分類說明大家通常都是使用遞歸實(shí)現(xiàn)無限極分類,都知道遞歸效率很低,下面推薦一個的擴(kuò)展包,快速讓你的數(shù)據(jù)模型支持無限極樹狀層級結(jié)構(gòu),并且兼顧效率。 本文經(jīng)授權(quán)轉(zhuǎn)自 PHPHub 社區(qū) 使用 Baum 嵌套集合模型來實(shí)現(xiàn) Laravel 模型的無限極分類 說明 大家通常都是使用遞歸實(shí)現(xiàn)無限極分類,都知道遞歸效率很低,下面推薦一個 Larav...
閱讀 1896·2019-08-30 15:53
閱讀 3220·2019-08-30 15:44
閱讀 2823·2019-08-26 13:31
閱讀 1972·2019-08-26 12:10
閱讀 826·2019-08-26 11:01
閱讀 2152·2019-08-23 15:32
閱讀 1612·2019-08-23 13:43
閱讀 2564·2019-08-23 11:58