这里首先介绍一下,什么是无限极分类?
无限极分类简单点说就是一个类可以分成多个子类,然后一个子类又可以分另外多个子类这样无限分下去,就好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一些个文件夹,在文件夹底下还可以建一些文件夹一样
示例如图:
那PHP又是如何实现它的无限分类的呢?如何把它的各个分类一一列出来呢?
方法一、递归思想
PHP大部分人用递归来写生成树,不过PHP默认最多递归次数为100,并不是理论上的无限,其次递归的内存占有过大,php的内存分配是除了对象,其余的为直接copy内存,所以有时候会导致内存占用过大
public function generateTree($items , $pId) { $tree = []; foreach($items as $k => $v) { if($v['pid'] == $pId) { if (!empty($this->generateTree($items , $v['id']))) { $v['childs'] = $this->generateTree($items , $v['id']); } $tree[] = $v; } } return $tree; }generateTree($array,0);
缺点: 一旦数据量大,耗时非常长,影响性能.
二、引用思想
// 例子:$arr=array( array('id'=>'1','name'=>'北京','pid'=>'0'), array('id'=>'2','name'=>'上海','pid'=>'0'), array('id'=>'3','name'=>'浦东','pid'=>'2'), array('id'=>'4','name'=>'朝阳','pid'=>'1'), array('id'=>'5','name'=>'广州','pid'=>'0'), array('id'=>'6','name'=>'三里屯','pid'=>'4'), array('id'=>'7','name'=>'广东','pid'=>'5'), array('id'=>'8','name'=>'三里','pid'=>'4'), array('id'=>'10','name'=>'小胡同','pid'=>'8') );
首先 : 利用数组的索引与主键的id号相同来查找子栏目,首先为数组加上索引:
$arr=array( 1=>array('id'=>'1','name'=>'北京','pid'=>'0'), 2=>array('id'=>'2','name'=>'上海','pid'=>'0'), 3=>array('id'=>'3','name'=>'浦东','pid'=>'2'), 4=>array('id'=>'4','name'=>'朝阳','pid'=>'1'), 5=>array('id'=>'5','name'=>'广州','pid'=>'0'), 6=>array('id'=>'6','name'=>'三里屯','pid'=>'4'), 7=>array('id'=>'7','name'=>'广东','pid'=>'5'), 8=>array('id'=>'8','name'=>'三里','pid'=>'4'), 10=>array('id'=>'10','name'=>'小胡同','pid'=>'8') );
利用索引的下标,判断该栏目是否存在父栏目,如果存在就把该栏目放到父栏目的son子数组里面
function generateTree($items){ $index_items = []; foreach ($items as $item) { $index_items[$item['id']] = $item; } $tree = array(); foreach($index_items as $item){ //判断是否有数组的索引== if(isset($index_items[$item['pid']])){ //查找数组里面是否有该分类 如 isset($items[0]) isset($items[1]) $index_items[$item['pid']]['son'][] = &$index_items[$item['id']]; //上面的内容变化,$tree里面的值就变化 }else{ $tree[] = &$index_items[$item['id']]; //把他的地址给了$tree } } return $tree; } generateTree($array);
***进阶版: 参数默认可传
function tree( array $array, string $first, string $pid, string $id, string $child = 'childs' ): array { $tree = []; foreach ($array as $item) { $tree[$item[$id]] = $item; } foreach ($tree as $item) { $tree[$item[$pid]][$child][] = &$tree[$item[$id]]; } return $tree[$first][$child] ?? []; } tree($array,'1','pid','id');
参考: php实现无限极分类_叶落无痕的博客-CSDN博客_无限极分类
来源地址:https://blog.csdn.net/harris_lele/article/details/123243012