实现无限级分类时,父级ID不是和主键ID关联怎么处理数据

最近要优化一下项目的代码,其中有一块无限极分类是这么处理的

        $tree = new stdClass();
        if (!empty($cateGoryInfo)) {
            foreach ($cateGoryInfo as $key => $val) {//一级菜单数据获取
                if ($val->parent_id == 0) {
                    if ($val->category_img) {
                        $val->category_img = AppUrl::image($val->category_img);
                    }
                    $val->type    = CateType::description($val->type);
                    $tree->{$key} = $val;
                    unset($cateGoryInfo{$key});
                }
            }
            foreach ($tree as $i => $item) {
                $tree->{$i}->children = new stdClass();
                $k                    = 0;
                foreach ($cateGoryInfo as $key => $val) {//二级菜单数据获取
                    if ($item->category_id == $val->parent_id) {
                        if ($val->category_img) {
                            $val->category_img = AppUrl::image($val->category_img);
                        }
                        $val->type = CateType::description($val->type);
                        $tree->{$i}->children->{$k} = $val;
                        unset($cateGoryInfo{$key});
                        $k++;
                    }
                }
            }
            foreach ($tree as $i => $item) {
                foreach ($item->children as $k => $v) {
                    $tree->{$i}->children->{$k}->children = new stdClass();
                    $ke                                   = 0;
                    foreach ($cateGoryInfo as $key => $val) {//三级菜单获取
                        if ($val->parent_id == $v->category_id) {
                            if ($val->category_img) {
                                $val->category_img = AppUrl::image($val->category_img);
                            }
                            $val->type = CateType::description($val->type);
                            $tree->{$i}->children->{$k}->children->{$ke} = $val;
                            $ke++;
                        }
                    }
                }
            }
        }
        return $tree;

当我纳闷之前为什么当时不用递归或者引用去写呢 我去看了下表设计…

实现无限级分类时,父级ID不是和主键ID关联怎么处理数据

后知后觉这种表设计为啥用不了引用写法了…(因为category_id不是唯一,重组数组重复的值都会被覆盖)递归写法也是 直接死循环 为什么你们要这么设计表 :frowning: :frowning: :frowning: 然后我试过挺多方法 还是没法优化它。各位看官有什么好的意见没有,下图是我用递归和引用写的,没出正确结果

实现无限级分类时,父级ID不是和主键ID关联怎么处理数据

实现无限级分类时,父级ID不是和主键ID关联怎么处理数据

Reality
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4

通用无限级分类,貌似和是不是重复没什么关系。

    public function toTree(array $nodes = [], $parent_id = 0)
    {
        $tree = [];

        foreach ($nodes as $node)
        {
            if ($node->parent_id == $parent_id)
            {
                $children = $this->toTree($nodes, $node->category_id);

                if ($children)
                    $node->children = $children;

                $tree[] = $node;
            }
        }

        return $tree;
    }
3年前 评论
飞飞鱼 (楼主) 3年前
飞飞鱼 (楼主) 3年前

大兄弟 怎么不行了?我是试过了才发的。

$cateGoryInfo = [
            (object)(['id' => 1, 'category_id' => 4, 'parent_id' => 1]),
            (object)(['id' => 2, 'category_id' => 4, 'parent_id' => 2]),
            (object)(['id' => 3, 'category_id' => 5, 'parent_id' => 4]),
            (object)(['id' => 4, 'category_id' => 2, 'parent_id' => 0]),
            (object)(['id' => 5, 'category_id' => 1, 'parent_id' => 0]),
            (object)(['id' => 6, 'category_id' => 8, 'parent_id' => 4]),
            (object)(['id' => 7, 'category_id' => 8, 'parent_id' => 2]),
        ];

        $data = $this->toTree($cateGoryInfo);
        echo '<pre>';
        var_dump($data);exit;
3年前 评论
飞飞鱼 (楼主) 3年前

无限极分类,子节点只有一个唯一的父节点,父节点可以有多个子节点。看完表结构,没看出是无限极分类的数据结构。看看能不能去改改存储结构。

3年前 评论
飞飞鱼 (楼主) 3年前

代码表示看不懂!!!
一般这种分类,都是改了不会在变动的吧,最好搞个缓存,就好了。
我看了一下,你这个category_id应该还有一个category分类表吧,然后以这个分类表作为基础表,进行分类分配。我大概明白你的前任为啥这么建表。
应该是一组分类,一个分类可以有多个子分类,然后子分类呢,可以有多个父分类。
比如 视频->外套,衣服->外套,这里<外套>在category表只有一个,一般呢我会把<外套>弄成多个。
如果是这种情况的话,我说一下我的思路:
1、连表把所有的数据都查出来。
2、第一层循环把一级元素找出。
3、递归部分—以pid为条件进行对比,找出所有的子元素。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!