Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: rekurencja
Forum PHP.pl > Forum > PHP
atomas
Nie rozumiem do końca mechanizmu rekurencji a usiłuje go zastosować
Mam drzewo kategorii artykułów, które może mieć wiele poziomów i teraz próbuję odnaleźć kategorię jbardziej podstawową dla danej kategorii (najbardziej podstwowa ma url "brak"). Klucz w tabeli to pole o nazwie url, oto kod moich prób:

  1. function znajdz_nadrzedna($kategoria_url){
  2. global $db;
  3. $result=$db->query("select * from kategorie where url='".$kategoria_url."'");
  4. $badana=$result->fetch_object();
  5. $result1=$db->query("select * from kategorie where url='".$badana->nadrzedna_url."'");
  6. $nadrzedne.=$badana->nadrzedna_url."|";
  7. $nadrzedna=$result1->fetch_object();
  8. if($nadrzedna->url<>'brak'){
  9. $nadrzedne.=$nadrzedna->nadrzedna_url."|";
  10. znajdz_nadrzedna($nadrzedna->url);
  11. }
  12. return $nadrzedne;
  13. }


o ile dobrze rozumiem trzeba raz wykonać działanie sprawdzić czy trzeba drugi raz i w drugim działaniu rekurencyjnie wywołać funkcję. Co źle rozumiem? Może wszystko....
irmidjusz
Nie będę tego kodu analizował, ale na pierwszy rzut oka wygląda na klasyczny błąd - w linii 10. wynik zwracany przez rekurencyjne wywołanie znajdz_nadrzedna() przepada w nicość... może o to chodzi?
em1X
Nie daję gwarancji na ten kod, ponieważ nie znam żadnych szczegółów Twojej bazy, ani uwarunkowań z niej wynikających. Kod traktować należy jako podpowiedź jak prawidłowo pisać kod / powinna wyglądać rekurencja itd.

  1. function znajdz_nadrzedna($kategoria_url, & $nadrzedne)
  2. {
  3. global $db;
  4.  
  5. $filtr=htmlentities($kategoria_url, ENT_QUOTES);
  6. $result=$db->query('select nadrzedna_url from kategorie where url="'.$filtr.'"');
  7. $badana=$result->fetch_object();
  8.  
  9. $filtr=htmlentities($badana->nadrzedna_url, ENT_QUOTES);
  10. $result1=$db->query('select nadrzedna_url, url from kategorie where url="'.$filtr.'"');
  11. $nadrzedna=$result1->fetch_object();
  12.  
  13. $nadrzedne[]=$badana->nadrzedna_url;
  14.  
  15. if ($nadrzedna->url != 'brak') {
  16. $nadrzedne[]=$nadrzedna->nadrzedna_url;
  17. znajdz_nadrzedna($nadrzedna->url, $nadrzedne);
  18. }
  19.  
  20. // zwalniaj zasoby!
  21. $result->free();
  22. $result1->free();
  23. }


  1. $nadrzedne=array();
  2. znajdz_nadrzedna('jakis_url', $nadrzedne);
  3.  
  4. echo implode(' | ', $nadrzedne);
crafter
moze to wygladac tak, pisze z palca (mogą być błedy):

  1. $list = $model->getList(); //jakis obiekt - pierwszy poziom
  2.  
  3. funciton list($list) {
  4.  
  5. foreach ($list as $l) {
  6. echo $l->title;
  7. if ($l->hasChildren()) { //metoda gdzies w modelu sprawdzajaca czy rodzic ma dziecko
  8. //pobierz dzieci
  9. $children = $l->getChildren(); //pobranie dzieci
  10. list($children); //wywolanie funkcji list w parametrze obiekt juz dziecka poprzedniego rodzica:)
  11. }
  12. }
  13. }
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.