# 无限极分类
[TOC]
递归是程序调用自身的编程技巧。
* 使用静态变量存储递归
```
function deeploop()
{
static $i = 1;
echo $i;
$i++;
if ($i <= 10) {
deeploop();
}
}
deeploop();
```
* 使用 值引用 的形式
```
function deeploop2(&$i = 1)
{
echo $i;
$i++;
if ($i <= 10) {
deeploop2($i);
}
}
deeploop2();
```
* 使用 global 全局变量的形式
```
$i = 1;
function deeploop3()
{
global $i;
echo $i;
$i++;
if ($i <= 10) {
deeploop3();
}
}
deeploop3();
```
## 递归无限极分类原理
每一个分类都需要记录它的父级id,当为顶级分类时,父级id为0。这样无论哪个分类,都可以通过父级id一层层的去查明它所有的父级,以便清楚知道它所属何种分类,层级深度为多少。
* 表和数据准备
```
CREATE TABLE categories (
`id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_id` TINYINT UNSIGNED NOT NULL COMMENT '上级分类',
`cat_name` VARCHAR(12) NOT NULL DEFAULT '' COMMENT '栏目名称',
`order` TINYINT NOT NULL DEFAULT 100 COMMENT '排序',
`created_at` INT UNSIGNED NOT NULL COMMENT '创建时间',
PRIMARY KEY (id)
)ENGINE=InnoDB CHARSET "utf8" COMMENT '栏目分类表';
INSERT INTO categories VALUES (1,0,'新闻',1,unix_timestamp(now())),(2,0,'图片',2,unix_timestamp(now())),(3,1,'国内新闻',1,unix_timestamp(now())),(4,1,'国际新闻',2,unix_timestamp(now())),(5,3,'北京新闻',1,unix_timestamp(now())),(6,4,'美国新闻',2,unix_timestamp(now())),(7,2,'美女图片',1,unix_timestamp(now())),(8,2,'风景图片',2,unix_timestamp(now())),(9,7,'日韩明星',1,unix_timestamp(now())),(10,9,'日本AV',1,unix_timestamp(now()));
```
![](https://box.kancloud.cn/f480f87629fc702099ed8c69ddee1847_323x227.png)
## 无限极分类实现
```
/**
* 无限极分类树 getTree($categories)
* @param array $data
* @param int $parent_id
* @param int $level
* @return array
*/
function getTree($data = [], $parent_id = 0, $level = 0)
{
$tree = [];
if ($data && is_array($data)) {
foreach ($data as $v) {
if ($v['parent_id'] == $parent_id) {
$tree[] = [
'id' => $v['id'],
'level' => $level,
'cat_name' => $v['cat_name'],
'parent_id' => $v['parent_id'],
'children' => getTree($data, $v['id'], $level + 1),
];
}
}
}
return $tree;
}
/**
* 循环获取子孙树 getSubTree($categories)
*
* @param array $data
* @param int $id
* @param int $level
* @return array
*/
function getSubTree($data = [], $id = 0, $level = 0)
{
static $tree = [];
foreach ($data as $key => $value) {
if ($value['parent_id'] == $id) {
$value['laravel'] = $level;
$tree[] = $value;
getSubTree($data, $value['id'], $level + 1);
}
}
return $tree;
}
/**
* 递归获取子孙树 getSubTree2($categories, 1)
*
* @param array $data
* @param int $parent_id
* @param int $level
* @return array
*/
function getSubTree2($data = [], $parent_id = 0, $level = 0)
{
$tree = [];
if ($data && is_array($data)) {
foreach ($data as $key => $value) {
if ($value['parent_id'] == $parent_id) {
$value['laravel'] = $level;
$tree[] = $value;
$tree = array_merge($tree, getSubTree2($data, $value['id'], $level + 1));
}
}
}
return $tree;
}
```
```
/**
* 通过pid获取所有上级分类 常用于面包屑导航 getParentsByParentId2($categories, 9)
*
*
* @param array $data
* @param $parent_id
* @return array
*/
function getParentsByParentId($data = [], $parent_id)
{
static $categories = [];
if ($data && is_array($data)) {
foreach ($data as $item) {
if ($item['id'] == $parent_id) {
$categories[] = $item;
getParentsByParentId($data, $item['parent_id']);
}
}
}
return $categories;
}
function getParentsByParentId2($data = [], $parent_id)
{
$categories = [];
if ($data && is_array($data)) {
foreach ($data as $item) {
if ($item['id'] == $parent_id) {
$categories[] = $item;
$categories = array_merge($categories, getParentsByParentId2($data, $item['parent_id']));
}
}
}
return $categories;
}
```
- 开始
- PHP配置参数的介绍
- PHP代码优化
- php中的命名空间
- PHP文件上传类
- PHP文件下载
- PHP验证码
- ThinkPHP3.2 框架函数
- A函数:实例化控制器
- C函数:设置和获取配置参数
- D函数:实例化模型
- F 函数:快速缓存设置和存取
- M函数:例化模型(无需定义模型类)
- L函数:设置和获取语言变量
- S 函数:缓存设置和存取
- R函数:直接调用控制器的操作方法
- U函数:URL地址生成
- I 函数:安全获取系统输入变量
- 日志
- ThinkPHP在关闭调试模式导致函数被缓存
- MySQL触发器使用时遇到的坑
- PHP常用函数
- 五一回家记录
- window的PHP开发(wamp)下安装redis扩展
- Windows下安装使用Redis
- PHP7新特性
- 利用 phpmailer 类实现队列发送邮件
- GD 库图像处理
- 检测 PHP 模块是否开启
- GD 库操作一般步骤
- GD 库绘画改变字体
- GD 绘制验证码
- GD 缩略图实现
- GD 绘制水印
- 日期时间函数库
- PHP 函数
- 无限极分类