Клонирование ветки дерева (дерево Adjacency List)

ISSET

Новичок
Клонирование ветки дерева (дерево Adjacency List)

Использую дерево Adjacency List, то есть ID, PARENT, NAME

И теперь появился вопрос, как можно (и можно ли вообще) склонировать конкретную ветвь дерева? Надо создать точную копию ветки с добавкой на пример - copy к названиям новой ветки. Проблема в том, что надо по очереди создавать родителя, брать его ID и использоват этот ID как PARENT для нового ребёнка.

Пробовал так и никак не выходит. Есть идеи?

function Klonowanie($ParentId){

$DaneRodzica = mysql_fetch_array(mysql_query("SELECT pid, name FROM tp WHERE id = " . $ParentId));

$KlonRodzica = mysql_query("INSERT INTO tp VALUES (NULL, ".$DaneRodzica[0].", '".$DaneRodzica[1]."-klonR')");

$IdNowegoRodzica = mysql_insert_id();

$DzieciRodzica = mysql_query("SELECT * FROM tp WHERE pid = " . $ParentId . " ORDER BY name ASC");


while ($row = mysql_fetch_array($DzieciRodzica)) {

$klonDzieci = mysql_query("INSERT INTO tp VALUES (NULL, ".$IdNowegoRodzica.", '".$row["name"]."-klonD')");

Klonowanie($row["id"]);
}
}


print Klonowanie(1);


P.S. Сорри за ПХП, но по одной строке надо вкидывать?
 

Alexandre

PHPПенсионер
идея очень проста,
вытягиваешь ветвь - строешь ее отображение в массиве (на форуме был предложен очень хитроумный алгоритм без рекурсии)
далее обходишь эту ветвь добавляешь в БД
и прописываешь в ее корневой ноде parent_id той ноды, которая должна быть ее предком.
проще паренной репы
 

zerkms

TDD infected
Команда форума
вытягиваешь ветвь - строешь ее отображение в массиве (на форуме был предложен очень хитроумный алгоритм без рекурсии)
а зачем рекурсия-то?
array(id => array(data, parent_id)) - исходный массив
по мере обхода этого массива строишь второй массив соответствий "id было" <-> "id стало", при добавлении новых чайлдов id парентов берёшь из него.
 

zerkms

TDD infected
Команда форума
ISSET
вероятно потому, что ты даже и не пытался думать, а ждёшь готовое решение. м?
 

ISSET

Новичок
СначалА подумаю над логикой. Как делать, идти по ветке в глубину нАПример:

Parent1
|--Child1
---|--Child_1_1
---|--Child_1_2
------|--Child_1_1_1
------|--Child_1_1_2

то есть вытянуть всю глубину ветви начиная от первого ребёнка

или

Parent1
|--Child1
|--Child2
|--Child3
|--Child4

вытянуть сначалА всех детей данНого парента?


Спасибо за поправление ошибок, у меня нет контакта с русским языком уже 10 лет :)
 

zerkms

TDD infected
Команда форума
тебе нужно всё вытянуть. всё в 1 плоский массив с элементами id, parent_id, data
 
Сверху