一篇关于处理无限层级递归优化处理问题

该代码示例展示了如何通过一次数据库查询获取所有一级分类,并使用引用方式构建层级结构,有效减少了数据库交互时间和执行时间,提高了系统性能。
/***
     * 获取所有的一级分类
     * @param Request $request
     * @return array
     */
    public function getAllCategory(Request $request)
    {
        try {
            $list = ProductClassModel::query()
                ->where(['site_id' => Site::getCurrentSite()->getSiteId()])
                ->where('status', 1)
                ->orderBy('order', 'asc')
                ->get();
            $list = !empty($list) ? $list->toArray() : [];
            $newList = self::getTree($list);
            return makeApiResponseSuccess('成功', $newList);
        } catch (\Exception $e) {
            return makeApiResponseError($e);
        }
    }

    /***
     * 优化无限递归
     * @param $items
     * @return array
     */
    public static function getTree($items)
    {
        $items = array_column($items, null, 'id');
        $tree = [];
        foreach ($items as $item) {
            $id = $item['id'];
            $pid = $item['parent_id'];
            isset($items[$pid]) ? $items[$pid]['sub'][$id] = &$items[$id] : $tree[$id] = &$items[$id];
        }

        return self::dueTree($tree);
    }

    /**
     * 处理层级
     * @param $tree
     * @param int $level
     * @return array
     */
    public static function dueTree($tree, $level = 1)
    {
        $newTree = [];
        $newLevel = $level;
        foreach ($tree as $key => &$val) {
            $val['level'] = $level;
            if (isset($val['sub']) && is_array($val['sub'])) {
                self::dueTree($val['sub'], ++$level);
            } else {
                $val['sub'] = [];
            }
            $level = $newLevel;
            $newTree[$key] = $val;
        }
        return $newTree;
    }

想法:一般在处理层级问题上大多数做法都是采用递归查询处理,这里采用一次查询,然后通过值引用方式遍历出层级关系,很大程度优化了查询数据库时间以及执行时间。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值