Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak Zliczyc ilosc wykonań funkcji
Forum PHP.pl > Forum > Przedszkole
Yacho
Problem jest nastepujacy :

Mam funkcje rekurencyjną :
  1. <?php
  2. function getCatTree($id)
  3. {
  4. $query = "SELECT cat_id FROM mod_xgallery_categories WHERE parent_id=$id";
  5. $result = mysql_query($query);
  6. while ($row = mysql_fetch_assoc($result))
  7. {
  8. //echo $row['cat_id'];
  9.  $i[] = $row['cat_id'];
  10.  
  11. }
  12. //print_r($i);
  13. if(is_array($i))
  14. {
  15.  
  16. foreach ($i as $v)
  17. {
  18. echo $v.'<br>';
  19. getCatTree($v);
  20. }
  21.  }
  22. }
  23.  
  24. getCatTree(0);
  25.  
  26. ?> 


Pobiera ona kategorie z bazy ulozone w drzewo - znaczy kazda kategoria ma przyporzadkowany Parent - i funkcja wyswietla od przekazanego $id parenta "w dół do końca"

Problem jest taki ze chcialbym wiedziec jaka jest "głębokosc" na danej kategorii aby drzewko odpowiednio ułozyc z tabulacjami smile.gif

jedyne co mi sie nasuwa to :

a) przed wywolaniem funkcji utworzyc sobie iterator powiedzmy $i i zwiększać jego wartość o jeden w Funkcji....
cool.gif pobierajac dane z bazy przy każdej kategorii pobierac pełną listę jego parentów....

Rozwiazanie a) jest fajne wydajnościowo ale troche niepraktyczne - bez zadeklarowania zmiennej przed funkcją nie mam możliwosci liczenia "głębokosci" - co w sumie tworzy dosc nieprzejrzystą konstrkcję.

cool.gif rozwiazanie dosc przyjemne bo wygodne w użyciu ale odpada pod wzgledem wydajnosciowym.....

Wiec ma ktos moze pomysł jak rozwiązać taki problem bez użycia iteratorów poza funkcją ? a jesli musze użyc jakiegos zapytania SQL to niech to beda jakies 3 a nie po jednym zapytaniu per kategoria.....
SongoQ
A nie lepiej generowac sciezke podobnie jak system zapisuje pliki
np /katalog1/podkatalog/kolejnypodkatalog i napodstawie ilosci zaglebien robisz wciecia
Guest
no tak tak tak tongue.gif ale wtedy jest szereg ograniczen np :

Poniewaz zdjec bedzie dosc duzo potrzebne jest oparcie tego o baze - pozatym nie chce uzalezniac dzialania skryptu od systemu plików.....
Yacho
Sorry - to ja napisalem smile.gif tak czy siak powyzsze rozwiazanie odpada :/
NuLL
Rozwiazaniem ktore ja stosuje takich przypadkach jest bajer $i;

Pozatym zamiast deklarowac cos na zewn bo w funkcji korzystac z tablicy $GLOBALS.
Yacho
Mozesz zarzucic jakims przykladem ? dobrze rozumiem ?

  1. <?php
  2.  
  3. Function getCatTree($id)
  4. if(!isset($_GLOBAS['moj_iterator']))
  5. {
  6. $_GLOBALS['moj_iterator'] = 0
  7. }
  8. // tu dalsza czesc funkcji i przed wywolaniem rekurencyjnym dajemy:
  9. $_GLOBALS['moj_iterator']++;
  10.  
  11. ?>


Dobrze kumam ? w sumie to jest bardzo dobra metoda smile.gif tylko czy ja dobrze to kumam i czy $_GLOBALS bedzie sie zachowywac tak jak bym chcial ? smile.gif
DeyV
jeśli tworzyć drzewka przy pomocy rekurencji, to tylko tak winksmiley.jpg

  1. <?php
  2.  
  3.  
  4. getTree( $iId, $iPoziom = 0 ){
  5.  
  6.  echo ....
  7.  
  8.  $aChilds = getChilds( $iId );
  9.  
  10. foreach( $aChilds as iChildId ){
  11. getTree( $iChildId, $iPoziom +);
  12.  }
  13. }
  14.  
  15.  
  16. ?>


Chyba nic nie pomylilem, choć godzina średnio zdrowa, więc kto wie... winksmiley.jpg
Yacho
yyy nie rozumiem smile.gif mozez objasnic dokladnie ?

A konkretnie.... jaka jest roznica wtedy powiedzy GetTree a getChilds ?

Get Tree printuje mi wszystkie childy az do konca drzewa.... nie kumam smile.gif

OK napisalem takie cos :
  1. <?php
  2. function getChilds($id)
  3. {
  4. $query = "SELECT cat_id,name FROM mod_xgallery_categories WHERE parent_id=$id";
  5. $result = mysql_query($query);
  6. while ($row = mysql_fetch_assoc($result))
  7. {
  8.  $data[] = $row;
  9. }
  10.  
  11. return $data;
  12. }
  13.  
  14. function getTree ($id, $poziom = 0)
  15. {
  16. $childs = getChilds($id);
  17.  if(is_array($childs))
  18.  {
  19. foreach($childs as $k => $v)
  20. {
  21. echo $v['name'] .' '. $poziom. '<br/>';
  22.  
  23. getTree($v['cat_id'], $poziom +1);
  24. }
  25.  }
  26. }
  27. getTree(0);
  28.  
  29. ?>


i dziala smile.gif dzieki - nigdy byum nie pomyslal ze mozna to rozbuc na 2 funkcje i wtedy sie tak ladnie prosto robi smile.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.