# 無限極分類
[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()));
```

## 無限極分類實現
```
/**
* 無限極分類樹 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 函數
- 無限極分類