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