先上代码
$list = array_column($list,null,'id');
$res = [];
//遍历寻父 O(n)
foreach ($list as &$item) {
if (isset($list[$item['pid']])){
//注意下面有一个引用符 & !
$list[$item['pid']]['child'] []= &$item;
}elseif(!$item['pid']){ // 此处判断是否加入到结果集 $item['pid'] === null 或者 $item['pid'] == -1 之类的
$res []= &$item;
}
}
unset($item);
标题下面是测试用例和思路,白嫖党看到这里下去点个赞就行了。
无限分类在工作中遇到不少,常见的有要求如下:
1.输入二维数组包含id,category_name,pid,order_num四个字段.
2.输出多维数组
3.C数组的pid等于P数组的id,则有P[‘chile’=>[…, C, …]]
4.兄弟数组order_num小的排在前 P[‘chile’=>[A, B, C]], A[‘order_num’]<=B[‘order_num’]<=C[‘order_no’], order_no相等的情况下id小的排在前
5.输出结果的chile必须为下标数组
//输入
Array
(
[0] => Array
(
[id] => 1
[category_name] => 衣服
[pid] => 0
[order_num] => 1
)
[1] => Array
(
[id] => 2
[category_name] => 鞋子
[pid] => 0
[order_num] => 0
)
[2] => Array
(
[id] => 5
[category_name] => 玩具
[pid] => 0
[order_num] => 0
)
[3] => Array
(
[id] => 6
[category_name] => 材料
[pid] => 0
[order_num] => 0
)
[4] => Array
(
[id] => 7
[category_name] => T恤
[pid] => 1
[order_num] => 0
)
[5] => Array
(
[id] => 8
[category_name] => 沙滩裤
[pid] => 1
[order_num] => 1
)
[6] => Array
(
[id] => 9
[category_name] => 泳衣
[pid] => 1
[order_num] => 0
)
[7] => Array
(
[id] => 10
[category_name] => 牛仔裤
[pid] => 1
[order_num] => 0
)
[8] => Array
(
[id] => 11
[category_name] => 休闲裤
[pid] => 1
[order_num] => 0
)
[9] => Array
(
[id] => 12
[category_name] => 睡衣
[pid] => 1
[order_num] => 5
)
[10] => Array
(
[id] => 13
[category_name] => 拖鞋
[pid] => 2
[order_num] => 0
)
[11] => Array
(
[id] => 14
[category_name] => 人字拖
[pid] => 13
[order_num] => 0
)
[12] => Array
(
[id] => 15
[category_name] => 球鞋
[pid] => 2
[order_num] => 0
)
[13] => Array
(
[id] => 16
[category_name] => 板鞋
[pid] => 2
[order_num] => 0
)
[14] => Array
(
[id] => 17
[category_name] => 高跟鞋
[pid] => 2
[order_num] => 0
)
[15] => Array
(
[id] => 18
[category_name] => 跑鞋
[pid] => 2
[order_num] => 0
)
[16] => Array
(
[id] => 19
[category_name] => 鲜花
[pid] => 0
[order_num] => 1
)
)
//期待输出
Array
(
[0] => Array
(
[id] => 2
[category_name] => 鞋子
[pid] => 0
[order_num] => 0
[child] => Array
(
[0] => Array
(
[id] => 13
[category_name] => 拖鞋
[pid] => 2
[order_num] => 0
[child] => Array
(
[0] => Array
(
[id] => 14
[category_name] => 人字拖
[pid] => 13
[order_num] => 0
)
)
)
[1] => Array
(
[id] => 15
[category_name] => 球鞋
[pid] => 2
[order_num] => 0
)
[2] => Array
(
[id] => 16
[category_name] => 板鞋
[pid] => 2
[order_num] => 0
)
[3] => Array
(
[id] => 17
[category_name] => 高跟鞋
[pid] => 2
[order_num] => 0
)
[4] => Array
(
[id] => 18
[category_name] => 跑鞋
[pid] => 2
[order_num] => 0
)
)
)
[1] => Array
(
[id] => 5
[category_name] => 玩具
[pid] => 0
[order_num] => 0
)
[2] => Array
(
[id] => 6
[category_name] => 材料
[pid] => 0
[order_num] => 0
)
[3] => Array
(
[id] => 1
[category_name] => 衣服
[pid] => 0
[order_num] => 1
[child] => Array
(
[0] => Array
(
[id] => 7
[category_name] => T恤
[pid] => 1
[order_num] => 0
)
[1] => Array
(
[id] => 9
[category_name] => 泳衣
[pid] => 1
[order_num] => 0
)
[2] => Array
(
[id] => 10
[category_name] => 牛仔裤
[pid] => 1
[order_num] => 0
)
[3] => Array
(
[id] => 11
[category_name] => 休闲裤
[pid] => 1
[order_num] => 0
)
[4] => Array
(
[id] => 8
[category_name] => 沙滩裤
[pid] => 1
[order_num] => 1
)
[5] => Array
(
[id] => 12
[category_name] => 睡衣
[pid] => 1
[order_num] => 5
)
)
)
[4] => Array
(
[id] => 19
[category_name] => 鲜花
[pid] => 0
[order_num] => 1
)
)
//以id作为主键
$list = array_column($list,null,'id');
//遍历寻父 O(n)
foreach ($list as $key=>$item) {
if (isset($list[$item['pid']])){
//注意下面有一个引用符 & !
$list[$item['pid']]['child'] [$key]= &$list[$key];
}
}
//遍历去重 O(n)
$keys = array_keys($list);
foreach ($keys as $key) {
if (isset($list[$list[$key]['pid']])){
unset($list[$key]);
}
}
return $list;
如果前端小伙伴要求返回下标数组,可以递归使用array_value 复杂度依然是O(n)