[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
~~~