PHP非递归方式实现无限分类(转载)

来源:互联网 发布:网易uu加速器mac版 编辑:程序博客网 时间:2024/05/22 08:27


<?php
$list = [
1=>['id'=>1,'pid'=>0,'name'=>'服装'],
2=>['id'=>2,'pid'=>0,'name'=>'数码'],
3=>['id'=>3,'pid'=>0,'name'=>'食品'],
4=>['id'=>4,'pid'=>1,'name'=>'男装'],
5=>['id'=>5,'pid'=>1,'name'=>'女装'],
6=>['id'=>6,'pid'=>1,'name'=>'童装'],
7=>['id'=>7,'pid'=>1,'name'=>'内衣'],
8=>['id'=>8,'pid'=>2,'name'=>'平板电脑'],
9=>['id'=>9,'pid'=>2,'name'=>'摄像摄影'],
10=>['id'=>10,'pid'=>2,'name'=>'智能数码'],
11=>['id'=>11,'pid'=>2,'name'=>'娱乐影音'],
12=>['id'=>12,'pid'=>3,'name'=>'新鲜水果'],
13=>['id'=>13,'pid'=>3,'name'=>'蔬菜蛋品'],
14=>['id'=>14,'pid'=>3,'name'=>'精选肉类'],
15=>['id'=>15,'pid'=>3,'name'=>'海鲜水产'],
16=>['id'=>16,'pid'=>7,'name'=>'男士内衣'],
17=>['id'=>17,'pid'=>7,'name'=>'女生内衣'],
];
function genTree9($items) {
$tree = array(); //格式化好的树
foreach ($items as $item){
if (isset($items[$item['pid']])){
$items[$item['pid']]['son'][] = &$items[$item['id']];
}
else{
$tree[] = &$items[$item['id']];
}
}
return $tree;
}
var_dump(genTree9($list));
//获取给定分类的顶级id
//顶级分类 当前 pid 不存在 $items的下标中 则 顶级分类
function topLevel($id,$items){
while(isset($items[$id]['pid']) && $items[$id]['pid']){
$id = $items[$id]['pid'];
}
return $id;
}
//获取给定分类的所有子类
function getSubLevel($id,$items){
$subs = [$id];
do{
$len = count($subs);
foreach ($items as $item){
if(in_array($item['pid'],$subs)){
$subs[] = $item['id'];
unset($items[$item['id']]);
}
}
}while(count($subs)>$len);
return $subs;
}
var_dump(getSubLevel(2,$list));