php 十行代码完成无限分类 无限分类的几种写法

7 篇文章 0 订阅
1 篇文章 0 订阅

先上代码

		$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)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值