我有带有类别(4个级别)的表,例如:
+-------+---------------+---------------------------+
| id | sub_for | level |
+-------+---------------+---------------------------+
| 1 | 0 | 1 | - main category
| 2 | 1 | 2 | - first level
| 3 | 2 | 3 | - second level
| 4 | 3 | 4 | - third level
+-------+---------------+---------------------------+
我将有多个类别和子类别。
因此,当我选择主要类别(级别1)时,我需要选择所有子类别。
我可以达到第二个水平:
$findInIds = array();
$data['category'] = '1';
$query = $this->db->query('SELECT id FROM shop_categories WHERE sub_for = ' . $data['category']);
foreach ($query->result() as $row) {
$findInIds[] = $row->id;
}
我得到了与所选主要类别相关的所有2级子类别的数组。
Array
(
[0] => 2
)
我想我应该使用一些递归函数循环到第4级,但是我在这里迷路了...
答案 0 :(得分:2)
因此,您在正确的道路上,需要遵循它。 您已经检查了第一个类别的结果,您需要检查的是孩子以及孩子的孩子。
下面使用while循环而不是递归。 我们将找到的每个子类别添加到下一步需要查看的子类别列表中。 然后,我们检查每个子类别,并将所有新的子类别也添加到列表中。 一旦我们检查了最后一个leaf category,while循环将结束。 (没有任何子类别的类别。)
此外,由于array_pop从数组的末尾删除了元素,而[]在数组的末尾添加了元素,因此实际上是Depth First Search,我们先检查树,然后再检查在同一棵树上。
// Initialize arrays
$findInIds = [];
$idsToCheck = [];
// Load up First Category
$idsToCheck[] = '1';
while(count($idsToCheck)){
// Grab a new category to check
$idToCheck = array_pop($idsToCheck);
// Make the query
$query = $this->db->query('SELECT id FROM shop_categories WHERE sub_for = ' . $idToCheck); // TODO: use query sanitization or parameterized queries
foreach ($query->result() as $row) {
// Foreach Result ...
// - Add to find in ids (This is a subcategory of the category we are checking)
// - Add to ids to check (This subcategory may have subcategories itself)
$findInIds[] = $row->id;
$idsToCheck[] = $row->id;
}
}