Основная категория + 3 уровня подкатегорий в php и codeigniter - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть таблица с категориями (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 голосов
/ 18 сентября 2018

Итак, вы на правильном пути, вам нужно пройти его до конца. Вы получили результат для первой категории, вам нужно проверить, есть ли это дети и дети детей.

Ниже используется цикл while вместо рекурсии. Мы добавляем каждую найденную подкатегорию в список подкатегорий, на которые нам нужно обратить внимание. Затем мы проверяем каждую подкатегорию, добавляя в список новые подкатегории. Цикл while закончится, как только мы проверим последнюю категорию листа . (Категория, в которой нет детей).

Кроме того, поскольку array_pop удаляет элементы из конца массива, а [] добавляет в конец, это фактически Поиск в глубину , где мы проверяем дерево перед проверкой на том же уровне дерева.

// 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...