[TOC]
### 遞歸算法
遍歷數組,根據每條數據的id值去尋找所有parent\_id值等于自己id值的數據,直到找不到為止。
`~~~
```
/**
?*?無限極分類(遞歸方式)
?*@param??array?$categoryies?需要分類的數組
?*@param??int???$parent_id???需要查詢的頂級分類id,默認為0?表示頂級分類
?*@param??int???$level???????默認0?表示是頂級分類??增加無限極分類的層級標識?用于在模板顯示縮進層級關系
?
?*@return??array?返回一個已經無限極分類完成的數組
?*/
function?limit_category($categoryies,?$parent_id?=?0,?$level?=?0)
{
????//定義一個靜態數組?用于保存每次遍歷得到的結果
????static?$res?=?[];
????//遍歷數組?進行數據判斷
????foreach($categoryies?as?$key?=>?$val)
????{
????????if($val['parent_id']?==?$parent_id)
????????{
????????????$val['level']?=?$level;
????????????//是要找的父級分類內容
????????????$res[]?=?$val;
????????????//遞歸點?當前分類有可能有子分類
????????????limit_category($categoryies,?$val['id'],?$level?+?1);?//注意這里是id不是parent_id?!!
????????}
????}
????return?$res;
}
```
最后返回的數組結構如下:
```
array?(size=6)
??0?=>?
????array?(size=5)
??????'cat_id'?=>?int?80
??????'cname'?=>?string?'軟件開發'?(length=12)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
??????'level'?=>?int?0
??1?=>?
????array?(size=5)
??????'cat_id'?=>?int?7
??????'cname'?=>?string?'php'?(length=3)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?80
??????'level'?=>?int?1
??2?=>?
????array?(size=5)
??????'cat_id'?=>?int?6
??????'cname'?=>?string?'mysql'?(length=5)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?80
??????'level'?=>?int?1
??3?=>?
????array?(size=5)
??????'cat_id'?=>?int?74
??????'cname'?=>?string?'Linux'?(length=5)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?80
??????'level'?=>?int?1
??4?=>?
????array?(size=5)
??????'cat_id'?=>?int?87
??????'cname'?=>?string?'生活隨筆'?(length=12)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
??????'level'?=>?int?0
??5?=>?
????array?(size=5)
??????'cat_id'?=>?int?94
??????'cname'?=>?string?'鄰居'?(length=6)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
??????'level'?=>?int?0
```
~~~