Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak Zliczyc ilosc wykonań funkcji, Wewnatrz tehrze Funkcji
Yacho
post
Post #1





Grupa: Zarejestrowani
Postów: 148
Pomógł: 0
Dołączył: 16.06.2003

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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....
(IMG:http://forum.php.pl/style_emoticons/default/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ę.

(IMG:http://forum.php.pl/style_emoticons/default/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.....
Go to the top of the page
+Quote Post
SongoQ
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


A nie lepiej generowac sciezke podobnie jak system zapisuje pliki
np /katalog1/podkatalog/kolejnypodkatalog i napodstawie ilosci zaglebien robisz wciecia
Go to the top of the page
+Quote Post
-Guest-
post
Post #3





Goście







no tak tak tak (IMG:http://forum.php.pl/style_emoticons/default/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.....
Go to the top of the page
+Quote Post
Yacho
post
Post #4





Grupa: Zarejestrowani
Postów: 148
Pomógł: 0
Dołączył: 16.06.2003

Ostrzeżenie: (0%)
-----


Sorry - to ja napisalem (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) tak czy siak powyzsze rozwiazanie odpada :/
Go to the top of the page
+Quote Post
NuLL
post
Post #5





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


Rozwiazaniem ktore ja stosuje takich przypadkach jest bajer $i;

Pozatym zamiast deklarowac cos na zewn bo w funkcji korzystac z tablicy $GLOBALS.
Go to the top of the page
+Quote Post
Yacho
post
Post #6





Grupa: Zarejestrowani
Postów: 148
Pomógł: 0
Dołączył: 16.06.2003

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) tylko czy ja dobrze to kumam i czy $_GLOBALS bedzie sie zachowywac tak jak bym chcial ? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
DeyV
post
Post #7





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




jeśli tworzyć drzewka przy pomocy rekurencji, to tylko tak (IMG:http://forum.php.pl/style_emoticons/default/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... (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Yacho
post
Post #8





Grupa: Zarejestrowani
Postów: 148
Pomógł: 0
Dołączył: 16.06.2003

Ostrzeżenie: (0%)
-----


yyy nie rozumiem (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) dzieki - nigdy byum nie pomyslal ze mozna to rozbuc na 2 funkcje i wtedy sie tak ladnie prosto robi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Yacho 2.12.2005, 22:17:56
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.12.2025 - 03:24