рекурсия — Как построить список древовидной структуры?

Итак, моя проблема в том, что я хочу построить дерево из этих двух таблиц:

Parent table:
+-------+---------------+
| pr_id |  parent_name  |
+-------+---------------+
|   1   |       p       |
|   2   |      p_0      |
|   3   |     p_0_1     |
|   4   |       q       |
+-------+---------------+

Child table:
+-------+---------------+---------------------------+
| ch_id |     pr_id     |        child_name         |
+-------+---------------+---------------------------+
|   1   |       1       |            p_0            |
|   2   |       1       |            p_1            |
|   3   |       2       |           p_0_0           |
|   4   |       2       |           p_0_1           |
|   5   |       3       |          p_0_1_0          |
|   6   |       3       |          p_0_1_1          |
|   7   |       4       |            q_0            |
|   8   |       4       |            q_1            |
+-------+---------------+---------------------------+

И дерево должно выглядеть так:

  • п
    • p_0
      • p_0_0
      • p_0_1
        • p_0_1_0
        • p_0_1_1
  • Q

Кто-нибудь может мне помочь с рекурсивным решением ??

6

Решение

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

+-------+---------------+---------------------------+
|   id  |   parent_id   |           title           |
+-------+---------------+---------------------------+
|   1   |       0       |   Parent Page             |
|   2   |       1       |   Sub Page                |
|   3   |       2       |   Sub Sub Page            |
|   4   |       0       |   Another Parent Page     |
+-------+---------------+---------------------------+

Сгенерированный массив будет выглядеть как

Array
(
[0] => Array
(
[id] => 1
[parent_id] => 0
[title] => Parent Page
[children] => Array
(
[0] => Array
(
[id] => 2
[parent_id] => 1
[title] => Sub Page
[children] => Array
(
[0] => Array
(
[id] => 3
[parent_id] => 1
[title] => Sub Sub Page
)
)
)
)
)
[1] => Array
(
[id] => 4
[parent_id] => 0
[title] => Another Parent Page
)
)

Вам нужно использовать приведенную ниже рекурсивную функцию, чтобы достичь этого

function buildTree(array $elements, $parentId = 0) {
$branch = array();

foreach ($elements as $element) {
if ($element['parent_id'] == $parentId) {
$children = buildTree($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
}
}

return $branch;
}

$tree = buildTree($rows);

Алгоритм довольно прост:

  1. Возьмите массив всех элементов и идентификатор текущего родителя.
    (изначально 0 / ничего / ноль / что угодно).
  2. Перебрать все элементы.
  3. Если parent_id элемента соответствует текущему родительскому идентификатору, который вы получили в 1., элемент является дочерним по отношению к родительскому элементу. Поместите это в свой список
    текущих детей (здесь: $ branch).
  4. Вызовите функцию рекурсивно с идентификатором элемента, который вы только что определили в 3., то есть найдите всех потомков этого элемента,
    и добавьте их как дочерний элемент.
  5. Верните список найденных детей.
28

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]