[TOC]
### 引用算法
由于眾所周知的原因,遞歸對資源的消耗是非常大的,實際執行起來效率也很低,所以有了下面的通過引用算法
~~~
/**
?*?無限極分類(引用方式)
?*@param??array?$data需要分類的數組
?*@return?array?返回一個已經無限極分類完成的數組
?*/
function?getTree($data)
{
????$items?=?array();
????
????//構建一個新的數組?新數組的key值是自己的主鍵id值(我這里表的主鍵是cat_id)
????//為何要構建這樣一個數組?這就是和下面第二個foreach有關了,看了代碼后就會明白何為巧妙引用了
????foreach($data?as?$v)
????{
????????$items[$v['cat_id']]?=?$v;
????}
????$tree?=?array();
????//將數據進行無限極分類??
????foreach($items?as?$key?=>?$val)
????{
????????if(isset($items[$val['parent_id']]))
????????{
????????????//關鍵是看這個判斷,是頂級分類就給$tree,不是的話繼續拼湊子分類(結合上述&用法)
????????????$items[?$val['parent_id']?]?['child']?[]?=?&$items[$key];
????????}
????????else
????????{
????????????$tree[]?=?&$items[$key];
????????}
????}
????//返回無限極分類后的數據
????return?$tree;
}
~~~
上面代碼中第一個foreach之后 $items數組變成如下結構:
~~~
array?(size=6)
??7?=>?
????array?(size=4)
??????'cat_id'?=>?int?7
??????'cname'?=>?string?'php'?(length=3)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?80
??6?=>?
????array?(size=4)
??????'cat_id'?=>?int?6
??????'cname'?=>?string?'mysql'?(length=5)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?80
??74?=>?
????array?(size=4)
??????'cat_id'?=>?int?74
??????'cname'?=>?string?'Linux'?(length=5)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?80
??80?=>?
????array?(size=4)
??????'cat_id'?=>?int?80
??????'cname'?=>?string?'軟件開發'?(length=12)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
??87?=>?
????array?(size=4)
??????'cat_id'?=>?int?87
??????'cname'?=>?string?'生活隨筆'?(length=12)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
??94?=>?
????array?(size=4)
??????'cat_id'?=>?int?94
??????'cname'?=>?string?'鄰居'?(length=6)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
~~~
第二個foreach之后 $tree數組變成如下結構:
~~~
array?(size=3)
??0?=>?
????array?(size=5)
??????'cat_id'?=>?int?80
??????'cname'?=>?string?'軟件開發'?(length=12)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
??????'child'?=>?
????????array?(size=3)
??????????0?=>?
????????????array?(size=4)
??????????????'cat_id'?=>?int?7
??????????????'cname'?=>?string?'php'?(length=3)
??????????????'is_show'?=>?int?1
??????????????'parent_id'?=>?int?80
??????????1?=>?
????????????array?(size=4)
??????????????'cat_id'?=>?int?6
??????????????'cname'?=>?string?'mysql'?(length=5)
??????????????'is_show'?=>?int?1
??????????????'parent_id'?=>?int?80
??????????2?=>?
????????????array?(size=4)
??????????????'cat_id'?=>?int?74
??????????????'cname'?=>?string?'Linux'?(length=5)
??????????????'is_show'?=>?int?1
??????????????'parent_id'?=>?int?80
??1?=>?
????array?(size=4)
??????'cat_id'?=>?int?87
??????'cname'?=>?string?'生活隨筆'?(length=12)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
??2?=>?
????array?(size=4)
??????'cat_id'?=>?int?94
??????'cname'?=>?string?'鄰居'?(length=6)
??????'is_show'?=>?int?1
??????'parent_id'?=>?int?0
~~~