成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

PHP 實(shí)現(xiàn)無(wú)限分類(lèi)

ysl_unh / 1103人閱讀

摘要:下面就記錄下我在寫(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)整理排序。排序好的效果如下圖:

渲染視圖

            @foreach($list as $val)
                
                @if(!empty($val ["childer"]))
                    {{get_childer_node($val ["childer"])}}
                @endif
            @endforeach
            
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

相關(guān)文章

  • PHP 無(wú)限級(jí)分類(lèi)最佳實(shí)踐

    無(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...

    yzzz 評(píng)論0 收藏0
  • PHP框架之ThinkPHP模塊開(kāi)發(fā)系列八,無(wú)限級(jí)分類(lèi)的刪除

    摘要:我們?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é)...

    BWrong 評(píng)論0 收藏0
  • PHP中的無(wú)限級(jí)分類(lèi)、無(wú)限嵌套評(pí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)該都...

    Shisui 評(píng)論0 收藏0
  • PHP中的無(wú)限級(jí)分類(lèi)、無(wú)限嵌套評(pí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)該都...

    李義 評(píng)論0 收藏0
  • 使用 Baum 嵌套集合模型來(lái)實(shí)現(xiàn) Laravel 模型的無(wú)限分類(lèi)

    摘要:本文經(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...

    superPershing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

ysl_unh

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<