php和codeigniter中的主要类别+ 3个级别的子类别

时间:2018-09-18 01:10:55

标签: php mysql codeigniter

我有带有类别(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级,但是我在这里迷路了...

1 个答案:

答案 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;
    }
}