Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klonowanie gałęzi w drzewku - rekurencja?
Forum PHP.pl > Forum > PHP
miedzna
Witajcie, jest problem, mam drzewko w klasycznym układzie, czyli ID|Name|Parent które mi generuje takie coś:

Książki
|- Kryminał
|-- Kryminał_1
|--- Kryminał_2

i zaszła potrzeba klonowania całych gałęzi, czyli stworzenie drzewka w stylu:

Książki
|- Kryminał
|-- Kryminał_1
|--- Kryminał_2
|
|- Kryminał_klon
|-- Kryminał_1_klon
|--- Kryminał_2_klon

Napisałem funkcję, która mi przelatuje po całej gałęzi i wyciąga wszystkie dzieci dla danego rodzica:

  1. <?php
  2. function Test($id){
  3.  
  4.    $dane = mysql_query("SELECT * FROM tabela WHERE parent = " . $id . " ORDER BY name ASC");
  5.  
  6.    while ($row = mysql_fetch_array($dane)) {
  7.  
  8.        if(isset($row["id"])){
  9.            
  10.            Test($row["id"]);
  11.        }
  12.  
  13.    }
  14.  
  15. }
  16.  
  17. print Test('24');
  18. ?>


i teraz myślę i nie wiem, jak dodać do bazy pobraną gałąź? Myślałem, że można to robić po kolei, czyli dodaję rodzica, za pomocą mysql_insert_id pobieram jego ID i do tego ID dopisuję dziecko, tylko problem polega na tym, że skąd mam wiedzieć (już po pobraniu gałęzi) które dziecko ma być dodawane do którego rodzica, bo zauważcie, że w tabeli wyników trzymam parent dla starej gałęzi, a w przypadku tworzenia nowej, zmienna parent się zmienia.

Ktoś może mnie pokierować na właściwy tor myślenia, bo stanąłem w tym miejscu i nic dalej...
bigZbig
  1. Może cos takiego
  2.  
  3. <?php
  4. function Test($id, $copy_id = null){
  5.  
  6.   $dane = mysql_query("SELECT * FROM tabela WHERE parent = " . $id . " ORDER BY name ASC");
  7.  // wstawiam od razu $copy_id = INSERT $dane WHERE parent = $copy_id
  8.   while ($row = mysql_fetch_array($dane)) {
  9.  
  10.       if(isset($row["id"])){
  11.          
  12.           Test($row["id"], $copy_id);
  13.       }
  14.  
  15.   }
  16.  
  17. }
  18. ?>
miedzna
Udało mi się poprawnie klonować ale tylko 1 poziom, czyli wszystkie dzieci pod danym rodzicem, ale nie wiem z jakimi parametrami mam wywołać funkcję klonowania ponownie, żeby przeleciała po wszystkich poziomach zagłębienia. Siedzę nad tym już od kilku dni i nie bardzo mi wychodzi, poniżej kod, ponowne wywołanie funkcji zakomentowałem, bo tu właśnie jest chyba problem.

  1. <?php
  2. function Klonowanie($ParentId, $ParentName = null, $InsertId = null){
  3.  
  4.    // pobieram dane klonowanego rodzica
  5.    $DaneRodzica = mysql_fetch_array(mysql_query("SELECT * FROM tabela WHERE id = " . $ParentId));
  6.  
  7.  
  8.    // dodaje do bazy sklonowanego rodzica
  9.    $KlonRodzica = mysql_query("INSERT INTO tabela VALUES (NULL, '".$DaneRodzica[1]."', ".$DaneRodzica[2].", '".$DaneRodzica[3]."', '".$DaneRodzica[4]."')");
  10.    $IdNowegoRodzica = mysql_insert_id();
  11.  
  12.  
  13.    // pobieram z bazy dzieci klonowanego rodzica
  14.    $DzieciRodzica = mysql_query("SELECT * FROM tabela WHERE parent = " . $ParentId . " ORDER BY name ASC");
  15.  
  16.  
  17.    if(mysql_num_rows($DzieciRodzica) > 0){
  18.  
  19.  
  20.        while ($row = mysql_fetch_array($DzieciRodzica)) {
  21.  
  22.  
  23.            $klonDzieci = mysql_query("INSERT INTO tabela VALUES (NULL, '".$row["name"]."', ".$IdNowegoRodzica.", '".$row["start"]."', '".$row["stop"]."')");
  24.  
  25.  
  26.            //Klonowanie($row["id"]); <-- NIE WIEM CO DALEJ :(
  27.  
  28.        }
  29.    }
  30. }
  31.  
  32. print Klonowanie($_GET["id"]);
  33. ?>


Pomoże ktoś? Nospor, Ty zawsze pomagasz smile.gif
rzymek01
moment, moment, mówiąc drzewo masz na mysli takie drzewo z prawdziwego zdarzenia typu graf, gdzie znana jest struktura takiego drzewa?

czyli masz ustalony korzeń, gałęzie i liście, gdzie każdy liść ma te same parametry (oczywiście inne wartości moga być)

jesli tak to możesz zastosować algorytmy przechodzenia drzew

PS. albo jesli drzewo to masz w tablicy , to po prostu skopiuj tę tablicę i potem pozmieniasz tylko id czy nazwy
czyli wyciągasz z mysql całe drzewo które chcesz sklonować i zapisujesz do tablicy

potem robisz kopie tej tablicy, i w kopii zmieniasz np. nazwy na ..._klon i zapisujesz tą tablicę do bazy (oczywiście w etapach, czyli rodzic, dzieci..., wnukowie, zresztą zalezy jak to masz w bazie zapisane)
miedzna
To co, nikt nie wie jak to wykonać? sciana.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.