PHP 实现无限分类
最近打算做一个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"></i></a><a><i class="Hui-iconfont"></i></a><a title="删除"><i class="Hui-iconfont"></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"></i></a><a><i class="Hui-iconfont"></i></a></td></tr>HTML;// 如果该分类的依旧有子分类则再次遍历输出 if(!empty($val ['childer'])) {$callNum ++;get_childer_node($val ['childer']);}// 重置分类层级$callNum = 1;}
}
最终效果
PHP 实现无限分类相关推荐
- 关于一个无限分类的多选,单选相关的控件
最近在一个项目中需要用到无限分类的平铺多选,单选这些功能,查了一些资料,结果大都是一些用IFrame这样的东西做的,虽然用起来直观,但本人更喜欢集成控件形式的,于是抽了一些时间做了一个.思路是利用控件 ...
- php无限极下拉框,php递归实现无限分类生成下拉列表的函数
代码如下: /*------------------ */ //– 递归实现无限分类生成下拉列表函数 //– $tpl->assign('sort_list',createSortOptions ...
- php mysql 分类_php+mysql实现无限分类实例详解
本文实例讲述了php+mysql实现无限分类的方法.分享给大家供大家参考.具体分析如下: 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行 ...
- 简单好用的PHP无限分类
/** * author: askie * blog: http://www.pkphp.com * 版权: 随便用 * 无限分类 */ class Tree { public $da ...
- PHP无限分类-PHP100代码篇
<?php //无限分类,从子类找所有父类 //$id 子类ID function php100_xd($id){ $sql="select * from fl where id=' ...
- 深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现...
1.session的注意点: @session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] s ...
- php 追溯,php 无限分类父子追溯方法
php 无限分类父子追溯方法 //返回所有的叶子节点 public function scanNodeOfTree($result,&$array=array(),$parentId=0,$ ...
- php mysql无限_php+mysql实现无限分类实例详解
php+mysql实现无限分类实例详解 fenlei($arr[$i][0]); //$arr[$i][1]表示第$i+1个分类的id的值.进行递归,也就是把自己的id作为f_id参数把自己的子类 ...
- 论坛中,无限分类的原理
1.创建数据表 CREATE TABLE category( `cat_id` SMALLINT unsigned not null auto_increment comment '类别id', `c ...
最新文章
- PHP new self和new static的区别
- 访谈 | 杨卫华谈技术人成长,要善用社区提升自身影响力
- [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)
- 英特尔CPU控制机制存在隐秘开关 可被黑客利用成为后门
- easyui的validatebox重写自定义验证规则的几个实例
- 有效集法介绍(Active Set Method)
- C51单片机————串行接口
- 广工android嵌入式系统试卷_教育录播系统的选择
- 判断点在直线的哪一侧_【倒车入库】车身是否“正直”该怎么判断?
- Java基础教程【第二章:Java数据类型和变量】
- nodejs/pomelo 使用 mongodb 连接 mongo时 出现
- matlab信号探测,信号检测与估matlab仿真报告.doc
- 权重的计算(变异系数法)
- 高效能人士的七个习惯 读书笔记
- winMerge配色方案
- mac 微信 QQ 截图 问题
- [Win Desktop] Windows 桌面应用推荐一
- 蓝桥杯 模板Template Part9:PCF8591 ADC/DAC
- mysql8.0怎么样_MySQL8.0初体验
- Google浏览器常用快捷键
热门文章
- hibernate join fetch
- python数据结构与算法:二分查找
- C语言的一个关键字——static
- ColorMatrix 彩色矩阵
- Java开发环境的搭建以及使用eclipse创建项目
- 接口冲突的一种解决方法
- 【天线】天线基础:名词解释
- 连接此产品到计算机并打开此产品电源,n6705c 直流电源分析仪.pdf
- python爬取疫情信息html.xpath p标签_python xpath 如何过滤div中的script和style标签
- python与vb可以互换吗_vb能配合python写程序么?