最近打算做一个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 实现无限分类相关推荐

  1. 关于一个无限分类的多选,单选相关的控件

    最近在一个项目中需要用到无限分类的平铺多选,单选这些功能,查了一些资料,结果大都是一些用IFrame这样的东西做的,虽然用起来直观,但本人更喜欢集成控件形式的,于是抽了一些时间做了一个.思路是利用控件 ...

  2. php无限极下拉框,php递归实现无限分类生成下拉列表的函数

    代码如下: /*------------------ */ //– 递归实现无限分类生成下拉列表函数 //– $tpl->assign('sort_list',createSortOptions ...

  3. php mysql 分类_php+mysql实现无限分类实例详解

    本文实例讲述了php+mysql实现无限分类的方法.分享给大家供大家参考.具体分析如下: 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行 ...

  4. 简单好用的PHP无限分类

    /** * author: askie * blog: http://www.pkphp.com * 版权: 随便用 * 无限分类 */ class Tree {         public $da ...

  5. PHP无限分类-PHP100代码篇

    <?php  //无限分类,从子类找所有父类 //$id 子类ID function php100_xd($id){ $sql="select * from fl where id=' ...

  6. 深度实现session【包括session入库、session机制和session和cookie的使用方法,完善会话机制(在分布式机器中也能使用)】、无限分类的实现...

    1.session的注意点: @session_start();//这个配置需要注意,session开启中会有影响,所以使用错误抑制符进行限制[并且使用php.ini对session进行自动开启] s ...

  7. php 追溯,php 无限分类父子追溯方法

    php  无限分类父子追溯方法 //返回所有的叶子节点 public function scanNodeOfTree($result,&$array=array(),$parentId=0,$ ...

  8. php mysql无限_php+mysql实现无限分类实例详解

    php+mysql实现无限分类实例详解 fenlei($arr[$i][0]);   //$arr[$i][1]表示第$i+1个分类的id的值.进行递归,也就是把自己的id作为f_id参数把自己的子类 ...

  9. 论坛中,无限分类的原理

    1.创建数据表 CREATE TABLE category( `cat_id` SMALLINT unsigned not null auto_increment comment '类别id', `c ...

最新文章

  1. PHP new self和new static的区别
  2. 访谈 | 杨卫华谈技术人成长,要善用社区提升自身影响力
  3. [NOIP模拟测试3] 建造游乐园 题解(欧拉图性质)
  4. 英特尔CPU控制机制存在隐秘开关 可被黑客利用成为后门
  5. easyui的validatebox重写自定义验证规则的几个实例
  6. 有效集法介绍(Active Set Method)
  7. C51单片机————串行接口
  8. 广工android嵌入式系统试卷_教育录播系统的选择
  9. 判断点在直线的哪一侧_【倒车入库】车身是否“正直”该怎么判断?
  10. Java基础教程【第二章:Java数据类型和变量】
  11. nodejs/pomelo 使用 mongodb 连接 mongo时 出现
  12. matlab信号探测,信号检测与估matlab仿真报告.doc
  13. 权重的计算(变异系数法)
  14. 高效能人士的七个习惯 读书笔记
  15. winMerge配色方案
  16. mac 微信 QQ 截图 问题
  17. [Win Desktop] Windows 桌面应用推荐一
  18. 蓝桥杯 模板Template Part9:PCF8591 ADC/DAC
  19. mysql8.0怎么样_MySQL8.0初体验
  20. Google浏览器常用快捷键

热门文章

  1. hibernate join fetch
  2. python数据结构与算法:二分查找
  3. C语言的一个关键字——static
  4. ColorMatrix 彩色矩阵
  5. Java开发环境的搭建以及使用eclipse创建项目
  6. 接口冲突的一种解决方法
  7. 【天线】天线基础:名词解释
  8. 连接此产品到计算机并打开此产品电源,n6705c 直流电源分析仪.pdf
  9. python爬取疫情信息html.xpath p标签_python xpath 如何过滤div中的script和style标签
  10. python与vb可以互换吗_vb能配合python写程序么?