国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP 實現無限分類

ysl_unh / 1046人閱讀

摘要:下面就記錄下我在寫時實現無限分類的過程。方法是一個遞歸函數。這邊我自定義了一個遞歸函數用于獲取該分類下的子分類。具體實現如下獲取子節點記錄該分類的深度啟用禁用如果該分類的依舊有子分類則再次遍歷輸出重置分類層級最終效果

最近打算做一個blog,通常每篇文章都有屬于自己的分類。下面就記錄下我在寫blog時實現無限分類的過程。php框架用的是laravel,根據注釋也能輕松改成你習慣的框架。

數據表設計
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;
程序設計 添加分類
public function addClassify(Request $request)
{
    // laravel 框架自帶的驗證機制
    $this->validate(
        $request,
        [
            "name" => "required|unique:article_category",
            "remark" => "max:100",
            "pid" => "required|numeric"
        ],
        [
            "name.required" => "請填寫分類名!",
            "name.unique" => "改分類名已存在",
            "remark.max" => "分類簡介不能超過100個字符",
            "pid.numeric" => "分類id必須為數字"
        ]
    );
    // 獲取分類名
    $this->_category->name = $request->input("name");
    // 獲取分類父id,默認是0,為一級分類
    $this->_category->pid = $request->input("pid",0);
    // 分類簡介
    $this->_category->remark = $request->input("remark");
    // 寫入數據庫
    $result = $this->_category->save();
    // 返回結果
    $result = $result ? "操作成功" : "操作失敗";
    return back()->with("act_msg",$result);
}
獲取分類列表
/**
 * 加載視圖
 * @return [type] [description]
 */
public function classify()
{    
    // 從數據庫獲取所有分類記錄
    $node = $this->_category->orderBy("id","asc")->get();
    // 將分類以及子分類整理排序
    $node = $this->_treeNode($node->toArray(),0);
    // 加載視圖及分配數據
    return view("admin.classify",["list"=>$node]);
}

/**
 * 整理排序所有分類
 * @param  array   $data       從數據庫獲取的分類
 * @param  integer $parentId 父id,默認一級分類
 * @return array 
 */
private function _treeNode($data,$parentId = 0)
{
    // 用于保存整理好的分類節點
    $node = [];
    // 循環所有分類
    foreach ($data as $key => $value) {
        // 如果當前分類的父id等于要尋找的父id則寫入$node數組,并尋找當前分類id下的所有子分類
        if($parentId == $value ["pid"]) {
            $node [$key] = $value;
            $node [$key] ["childer"] = $this->_treeNode($data,$value ["id"]);
        }
    }
    return $node;
}    

方法classify是用于從數據庫獲取所有分類以及顯示模板。方法_treeNode是一個遞歸函數。將從數據庫獲取的所有分類整理排序。排序好的效果如下圖:

渲染視圖

            @foreach($list as $val)
                
                @if(!empty($val ["childer"]))
                    {{get_childer_node($val ["childer"])}}
                @endif
            @endforeach
            
ID 分類名 簡介 更新時間 發布狀態 操作
{{$val ["id"]}} {{$val ["name"]}} {{$val ["remark"]}} {{$val ["updated_at"]}} @if($val ["statu"] == "y") 啟用 @else 禁用 @endif

渲染視圖時需要判斷該分類下是否有子分類,如果只做到三級分類,此時只需要再來個二層循環就ok了。這邊我自定義了一個遞歸函數get_childer_node 用于獲取該分類下的子分類。具體實現如下:

/**
 * 獲取子節點
 * @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;
    }
}
最終效果

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/25802.html

相關文章

  • PHP 無限分類最佳實踐

    無限級分類 是一種很常見,很必須的功能,幾乎每個項目都有。 應用場景:下拉列表,樹型列表等 無限級分類的類型 前端實現(前端框架一般已經實現好了,只要后端按照指定格式傳數據給前端就可以生成了) 后端實現(下面主要講這種實現) 無限級多種實現 第一種(推薦) function infiniteSort($data, $showFName, $titleFName, $pidFName = p...

    yzzz 評論0 收藏0
  • PHP框架之ThinkPHP模塊開發系列八,無限分類的刪除

    摘要:我們在新建一個刪除前的鉤子函數,再利用遞歸方法實現子欄目的刪除。最后我們刪除把鉤子函數恢復到原始狀態在瀏覽器中輸入,然后點擊美國一欄中的刪除,此時會同時刪除美國下的紐約。至此,無限級分類的刪除功能操作完畢。 在此現更正一下之前的預告,之前忘記了先應該把無限級分類欄目列表功能做完,也就是刪除功能還沒做,所以今天我們先做刪除,下一節再做面包屑導航。非常抱歉。 同時,不知道是什么原因,上一節...

    BWrong 評論0 收藏0
  • PHP中的無限分類無限嵌套評論

    摘要:可以看到,我們首先獲取到了所有的數據,然后按照父級歸類。無限嵌套評論先來看下這個無限嵌套評論長什么樣子。文件掃描使用遞歸進行目錄文件的掃描的栗子。 回顧 上一篇文章我們講到實戰PHP數據結構基礎之遞歸。來回顧下什么是遞歸? 一般來說,遞歸被稱為函數自身的調用。 遞歸在開發中的實際運用 N級分類 無限級的分類在平常的開發中是常見的需求,并且在不少面試題中都會碰到。不管你做什么項目,應該都...

    Shisui 評論0 收藏0
  • PHP中的無限分類無限嵌套評論

    摘要:可以看到,我們首先獲取到了所有的數據,然后按照父級歸類。無限嵌套評論先來看下這個無限嵌套評論長什么樣子。文件掃描使用遞歸進行目錄文件的掃描的栗子。 回顧 上一篇文章我們講到實戰PHP數據結構基礎之遞歸。來回顧下什么是遞歸? 一般來說,遞歸被稱為函數自身的調用。 遞歸在開發中的實際運用 N級分類 無限級的分類在平常的開發中是常見的需求,并且在不少面試題中都會碰到。不管你做什么項目,應該都...

    李義 評論0 收藏0
  • 使用 Baum 嵌套集合模型來實現 Laravel 模型的無限分類

    摘要:本文經授權轉自社區使用嵌套集合模型來實現模型的無限極分類說明大家通常都是使用遞歸實現無限極分類,都知道遞歸效率很低,下面推薦一個的擴展包,快速讓你的數據模型支持無限極樹狀層級結構,并且兼顧效率。 本文經授權轉自 PHPHub 社區 使用 Baum 嵌套集合模型來實現 Laravel 模型的無限極分類 說明 大家通常都是使用遞歸實現無限極分類,都知道遞歸效率很低,下面推薦一個 Larav...

    superPershing 評論0 收藏0

發表評論

0條評論

ysl_unh

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<