Итак, моя проблема в том, что я хочу построить дерево из этих двух таблиц:
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 | +-------+---------------+---------------------------+
И Дерево должно выглядеть так:
Может ли кто-нибудь помочь мне с рекурсивным решением?
Вам не нужно создавать 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);
Алгоритм довольно прост: