Как записать дерево (многомерный массив) в базу в виде строк?

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

Использую jQuery-плагин jsTree, он позволяет строить деревья с неограниченной вложенностью, в итоге после постройки он может вернуть все дерево в виде json-строки, в php можно легко это превратить в многомерный массив.

И вот дальше нужно как-то так обойти этот массив и записать дерево в базу, пробовал написать, но столкнулся с проблемой: когда обошли детей одной из веток и вдруг узнали что у этой ветки есть братья то не могу вернуть обратно нужное значение родителя.

Вот что у меня получилось сделать: example.php

Если запустить пример то сразу видно по результату что не всем правильно поставились родители, помогите понять в чем причина?

Цель записать все это вот в таком простом виде
---------------------------------
id | parent_id | name         
---------------------------------
1 | 0              | node 1       
---------------------------------
2 | 1              | node 1-1    
---------------------------------
3 | 1              | node 1-2    
---------------------------------
4 | 0              | node 2       
---------------------------------
5 | 4              | node 2-1    
---------------------------------
6 | 4              | node 2-2    
---------------------------------
7 | 6              | node 2-2-1 
---------------------------------
8 | 4              | node 2-3    
---------------------------------
  • Вопрос задан
  • 478 просмотров
Решения вопроса 1
Denormalization
@Denormalization
Ошибка в том, что $curr_parent не возвращается к предыдущему значению.
Обычно рекурсивные скрипты пишут так:
function my_array_walk($array, $parent = 0) {
        global $final_result;

            foreach ($array as $item) {
                $final_result[$parent][] = [
                    'id'     => $item['data']['id'],
                    'name'   => $item['text'],
                    'parent' => $parent,
                ];

                if (count($item['children']) > 0) {
                    my_array_walk($item['children'], $item['data']['id']);
                }
            }
}


Т.е $parent мы передаем в вызов функции, и тогда, когда функция возвращается, $parent остается правильный.

Итоговый результат:
pastebin.com/tkgpHUbP
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы