PHP 实现无极限分类
数据库有以下商品分类
Id | parentId | name |
---|---|---|
1 | 0 | 水果 |
2 | 0 | 奶粉 |
3 | 1 | 苹果 |
4 | 3 | 青苹果 |
5 | 3 | 红苹果 |
6 | 2 | 进口奶粉 |
7 | 6 | 澳洲进口奶粉 |
8 | 0 | 3c数码 |
用你觉得最优的算法将以上记录按以下格式输出:
Id | name |
---|---|
1 | 水果 |
3 | – 苹果 |
4 | ----青苹果 |
5 | ---- 红苹果 |
2 | 奶粉 |
6 | – 进口奶粉 |
7 | ---- 澳洲进口奶粉 |
8 | 3c数码 |
1.从数据库里面查出所有的数据,整理后格式如下:
$cat = [
['id'=>1,'parentId'=>0,'name'=>'水果'],
['id'=>2,'parentId'=>0,'name'=>'奶粉'],
['id'=>3,'parentId'=>1,'name'=>'苹果'],
['id'=>4,'parentId'=>3,'name'=>'青苹果'],
['id'=>5,'parentId'=>3,'name'=>'红苹果'],
['id'=>6,'parentId'=>2,'name'=>'进口奶粉'],
['id'=>7,'parentId'=>6,'name'=>'澳洲进口奶粉'],
['id'=>8,'parentId'=>0,'name'=>'3c数码'],
];
2.重新调整数据结构
/**
* @param $cat
* @param int $parentId
* @param array $list
* @param int $i
* @return array
*/
function getCatTree($cat,$parentId=0,&$list=[],$i=0){
foreach ($cat as $k => $v) {
if($v['parentId'] == $parentId){
$v['name'] = line($i,$v['name']);
unset($v['parentId']);
$list[] = $v;
unset($cat[$k]);
getCatTree($cat,$v['id'],$list,$i+1);
}
continue;
}
return $list;
}
/**
* @param $i
* @param $name
* @return string
*/
function line($i,$name){
$line = '';
for($j=0;$j<$i;$j++){
$line .= '--';
}
return $line.$name;
}
3.调用写好的函数
$list = getCatTree($cat);
print_r($list);
//输出结果如下:
Array
(
[0] => Array
(
[id] => 1
[name] => 水果
)
[1] => Array
(
[id] => 3
[name] => --苹果
)
[2] => Array
(
[id] => 4
[name] => ----青苹果
)
[3] => Array
(
[id] => 5
[name] => ----红苹果
)
[4] => Array
(
[id] => 2
[name] => 奶粉
)
[5] => Array
(
[id] => 6
[name] => --进口奶粉
)
[6] => Array
(
[id] => 7
[name] => ----澳洲进口奶粉
)
[7] => Array
(
[id] => 8
[name] => 3c数码
)
)
扩展
function doCat($cat,$parentId=0,&$list=[]){
foreach ($cat as $k => $v) {
if($v['parentId'] == $parentId){
$list[$v['id']] = $v;
unset($cat[$k]);
doCat($cat,$v['id'],$list[$v['id']]['child']);
}
}
return $list;
}
$list = doCat($cat);
print_r($list)
//结果输入如下:
Array
(
[1] => Array
(
[id] => 1
[parentId] => 0
[name] => 水果
[child] => Array
(
[3] => Array
(
[id] => 3
[parentId] => 1
[name] => 苹果
[child] => Array
(
[4] => Array
(
[id] => 4
[parentId] => 3
[name] => 青苹果
[child] =>
)
[5] => Array
(
[id] => 5
[parentId] => 3
[name] => 红苹果
[child] =>
)
)
)
)
)
[2] => Array
(
[id] => 2
[parentId] => 0
[name] => 奶粉
[child] => Array
(
[6] => Array
(
[id] => 6
[parentId] => 2
[name] => 进口奶粉
[child] => Array
(
[7] => Array
(
[id] => 7
[parentId] => 6
[name] => 澳洲进口奶粉
[child] =>
)
)
)
)
)
[8] => Array
(
[id] => 8
[parentId] => 0
[name] => 3c数码
[child] =>
)
)