PHP 实现无限分类

news/2024/7/2 23:21:40

最近打算做一个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是一个递归函数。将从数据库获取的所有分类整理排序。排序好的效果如下图:

图片描述

渲染视图

<table class="table table-border table-bordered table-bg table-hover table-sort"><thead><tr class="text-c"><th width="25"><input type="checkbox" name="" value=""></th><th width="80">ID</th><!-- <th>标题</th> --><th width="120">分类名</th><th width="80">简介</th><!-- <th width="80">来源</th> --><th width="120">更新时间</th><th width="60">发布状态</th><th width="120">操作</th></tr></thead><tbody><!--遍历数据-->@foreach($list as $val)<tr class="text-c"><td><input type="checkbox" value="" name=""></td><td>{{$val ['id']}}</td><td class="text-l"><u title="查看">{{$val ['name']}}</u></td><td>{{$val ['remark']}}</td><td>{{$val ['updated_at']}}</td><td>@if($val ['statu'] == 'y')<span class="label label-success radius">启用</span> @else <span class="label label-danger radius">禁用</span> @endif</td><td class="f-14 td-manage"><a><i class="Hui-iconfont">&#xe6de;</i></a><a><i class="Hui-iconfont">&#xe6df;</i></a><a title="删除"><i class="Hui-iconfont">&#xe6e2;</i></a></td></tr><!--判断该分类下是否有子分类-->@if(!empty($val ['childer'])){{get_childer_node($val ['childer'])}}@endif@endforeach</tbody></table>

渲染视图时需要判断该分类下是否有子分类,如果只做到三级分类,此时只需要再来个二层循环就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 = '<span class="label label-success radius">启用</span>';else$isShow = '<span class="label label-danger radius">禁用</span>';echo <<<HTML<tr class="text-c"><td><input type="checkbox" value="" name=""></td><td>{$val ['id']}</td><td class="text-l">|----{$val ['name']}</span></td><td>{$val ['remark']}</td><td>{$val ['updated_at']}</td><td>$isShow</td><td><a><i class="Hui-iconfont">&#xe6df;</i></a><a><i class="Hui-iconfont">&#xe6e2;</i></a></td></tr>HTML;// 如果该分类的依旧有子分类则再次遍历输出 if(!empty($val ['childer'])) {$callNum ++;get_childer_node($val ['childer']);}// 重置分类层级$callNum = 1;}
}

最终效果

图片描述


http://lihuaxi.xjx100.cn/news/239602.html

相关文章

为什么您不需要精通数学就可以学习编程

by Pau Pavn通过保罗帕文(PauPavn) 为什么您不需要精通数学就可以学习编程 (Why you don’t need to excel at math to learn how to program) This is probably one of the greatest misconceptions I’ve ever heard.这可能是我听过的最大的误解之一。 If you want to prog…

计算机教师简介50字,教师风采个人简介50字数.docx

教师个人简介 50 字大全例一&#xff1a;大家好&#xff0c;我叫王力央。今年 12 岁了&#xff0c;我有很多的兴趣比如&#xff1a;跳绳、游泳、看书、写字和玩耍。我 喜欢的东西也很多&#xff1a;水果、蔬菜、大螃蟹、大龙虾。大家要多吃蔬菜少吃油炸食品身体才能强壮、健康。…

yjk只算弹性的不计算弹塑性_基于ANSYS Workbench的表面裂纹计算

一、写在前面本教程使用ANSYS Workbench17.0 进行试件表面裂纹的分析&#xff0c;求应力强度因子。需要提前说明的是&#xff0c;本案例没有工程背景&#xff0c;仅为说明裂纹相的计算方法&#xff0c;因此参数取值比较随意&#xff0c;大量设置都采用了默认值。对于实际工程&a…

Vue.js slots: 为什么你需要它们?

也许你已经看过了Vue.js slots的文档。我对这个功能从“为什么你可能需要它”到“没有它我怎么可能工作”的态度转变非常快。虽然文档已经解释了它的概念&#xff0c;但是这里有一个关于slots怎么改进应用程序代码库的真实例子。在我看来&#xff0c;slots是vue最有用和最有趣的…

【iCore4 双核心板_ARM】例程十七:USB_MSC实验——读/写U盘(大容量存储器)

实验方法&#xff1a; 1、将跳线冒跳至USB_UART,通过Micro USB 线将iCore4 USB-UART接口与电脑相连。 2、打开PUTTY软件。 3、通过读U盘转接线将U盘&#xff08;或者读卡器&#xff09;与iCore4 USB-OTG接口相连。大容量存储器为FAT32格式。 实验现象&#xff1a; 核心代码&…

[附源码]计算机毕业设计springboot抗疫医疗用品销售平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

JavaScript的“ this”通过成立一个高中乐队来解释

by Kevin Kononenko凯文科诺年科(Kevin Kononenko) JavaScript的“ this”通过成立一个高中乐队来解释 (JavaScript’s “this” Explained By Starting A High School Band) If you have ever been in a band, had a friend that started a band, or seen a corny 80s movie …

计算机防火墙不能启动,windows防火墙不能启动错误5

有的用户因为之前的原因关闭了防火墙&#xff0c;又因为某些原因需要打开防火墙&#xff0c;却提示防火墙不能启动&#xff0c;错误代码5。下面让学习啦小编为大家整理一些关于这个问题的解决答案&#xff0c;希望能帮到大家。Windows防火墙不能启动错误5的解决方法&#xff1a…