gpt4 book ai didi

php - 获取类别的所有项目及其子项

转载 作者:IT老高 更新时间:2023-10-28 23:52:50 24 4
gpt4 key购买 nike

我即将给出 100 个赏金积分来回答这个问题

所以我有一个关于递归的非常棘手的问题 - 如何获取类别的所有项目计数以及包含该父级的所有子级以及更深的直到结束?

我有 table :

+----+---------------+-----------------+
| id | category name | category_parent |
+----+---------------+-----------------+
| 1 | cars | 0 |
+----+---------------+-----------------+
| 2 | real estate | 0 |
+----+---------------+-----------------+
| 3 | clothes | 0 |
+----+---------------+-----------------+
| 4 | bmw | 1 |
+----+---------------+-----------------+
| 5 | audi | 1 |
+----+---------------+-----------------+
| 6 | 100 | 5 |
+----+---------------+-----------------+
| 7 | 80 | 5 |
+----+---------------+-----------------+
| 8 | A4 | 5 |
+----+---------------+-----------------+
| 9 | QUATRO | 8 |
+----+---------------+-----------------+
| 10 | TDI | 8 |
+----+---------------+-----------------+
| 11 | Black | 9 |
+----+---------------+-----------------+
| 12 | White | 9 |
+----+---------------+-----------------+
| 13 | 2 doors | 11 |
+----+---------------+-----------------+
| 14 | 5 doors | 11 |
+----+---------------+-----------------+

我的产品表如下所示:

+----+---------------+-----------------+
| id | category_id | name |
+----+---------------+-----------------+

例如,我想计算 cars 类别中的所有项目。所以基本上我应该通过这个类别 id (1) 并以某种方式进行递归来计算所有项目。但我不知道如何处理它,因为该类别的 child 可能是无限的。

因此,当我想知道该父项计数的所有项目时,我应该这样做:

1++:
4++
5++:
6++
7++
8++:
9++:
11++:
13++
14++
12++
10++

我希望你能理解我的需要,并给我任何可以帮助我的建议。

另外,这是我到目前为止所做的开始 - 我可以实现它,但将来我会陷入递归......所以它一文不值。

public function get_category_tree_id_list($cat_id, $list_array = FALSE)
{
if ( !$list_array ){
$items = $this->system->_getCustomTableData('categories', array(array('category_parent' => $cat_id)), 'id DESC');
$this->__tmp['id_list'] = [];
foreach ( $items as $key => $value ) {
$this->__tmp['id_list'][] = $value['id'];
}
}
}

最佳答案

您很可能想要做嵌套集。它们的设置有点棘手,但可以使查询简单得多。因此,您将拥有两列 - lftrgt,而不是父类别。左和右基本上是一个类别的边界,如果一个项目的类别 ID 在这些值之间,你就知道它是该类别的子项。

+----+---------------+-----+------+
| id | category name | lft | rgt |
+----+---------------+-----+------+
| 1 | cars | 1 | 24 |
+----+---------------+-----+------+
| 2 | bmw | 2 | 3 |
+----+---------------+-----+------+
| 5 | audi | 4 | 23 |
+----+---------------+-----+------+
| 6 | 100 | 5 | 6 |
+----+---------------+-----+------+
| 7 | 80 | 7 | 8 |
+----+---------------+-----+------+
| 8 | A4 | 9 | 22 |
+----+---------------+-----+------+
| 9 | TDI | 10 | 11 |
+----+---------------+-----+------+
| 10 | Quatro | 12 | 21 |
+----+---------------+-----+------+
| 11 | Black | 13 | 18 |
+----+---------------+-----+------+
| 12 | White | 19 | 20 |
+----+---------------+-----+------+
| 13 | 2 doors | 14 | 15 |
+----+---------------+-----+------+
| 14 | 5 doors | 16 | 17 |
+----+---------------+-----+------+

然后,要获取汽车类别中的项目数量,您可以像这样 super 简单地完成:

SELECT categories.name, items.id, items.category_id, items.name 
FROM categories
LEFT JOIN items
ON (items.category_id BETWEEN categories.lft AND categories.rgt)
WHERE categories.category_name = 'cars'

显然,您可以只更改 category_name 的值并获取任何类别中的项目。

抱歉,由于某种原因,当我上传到这里时图像旋转了,但是如果您将类别画成圆圈,然后对行进行编号,您可以看到左右的值应该是多少。

我只研究汽车,因为我认为您可以推断出其他类别。

enter image description here

所以如果你这样写你的类别:

Cars(BMW(), Audi(100(),80(),A4(TDI(),Quatro(Black(2dr(),5dr()), White())))

然后你可以用数字标记你的括号:

Cars[1]->(BMW[2]->()<-[3], Audi[4]->(100[5]->()<-[6],80[7]->()<-[8],A4[9]->(TDI[10]->()<-[11],Quatro[12]->(Black[13]->(2dr[14]->()<-[15], 5dr[16]->()<-[17])<-[18], White[19]->()<-[20])<-[21])<-[22])<-[23])<-[24]

或者,如果您将其绘制成一棵树,您可以这样标记它,用数字标记最左边的节点,并在标记完所有子节点后才标记右侧节点:

enter image description here

关于php - 获取类别的所有项目及其子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33510543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com