实现无限级分类时,父级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;
当我纳闷之前为什么当时不用递归或者引用去写呢 我去看了下表设计…
后知后觉这种表设计为啥用不了引用写法了…(因为category_id不是唯一,重组数组重复的值都会被覆盖)递归写法也是 直接死循环 为什么你们要这么设计表
![]()
![]()
然后我试过挺多方法 还是没法优化它。各位看官有什么好的意见没有,下图是我用递归和引用写的,没出正确结果
通用无限级分类,貌似和是不是重复没什么关系。
大兄弟 怎么不行了?我是试过了才发的。
无限极分类,子节点只有一个唯一的父节点,父节点可以有多个子节点。看完表结构,没看出是无限极分类的数据结构。看看能不能去改改存储结构。
代码表示看不懂!!!
一般这种分类,都是改了不会在变动的吧,最好搞个缓存,就好了。
我看了一下,你这个category_id应该还有一个category分类表吧,然后以这个分类表作为基础表,进行分类分配。我大概明白你的前任为啥这么建表。
应该是一组分类,一个分类可以有多个子分类,然后子分类呢,可以有多个父分类。
比如 视频->外套,衣服->外套,这里<外套>在category表只有一个,一般呢我会把<外套>弄成多个。
如果是这种情况的话,我说一下我的思路:
1、连表把所有的数据都查出来。
2、第一层循环把一级元素找出。
3、递归部分—以pid为条件进行对比,找出所有的子元素。