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

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

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

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

Вам не нужно создавать 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 / nothing / null / whatever).
  2. Прокрутите все элементы.
  3. Если parent_id элемента совпадает с текущим родительским идентификатором, который вы получили в 1., этот элемент является дочерним по отношению к родительскому элементу. Поместите его в список текущих детей (здесь: $ branch).
  4. Вызовите функцию рекурсивно с идентификатором элемента, который вы только что идентифицировали в 3., т. Е. Найдите все дочерние элементы этого элемента и добавьте их как дочерний элемент.
  5. Верните список найденных детей.