Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z funkcją rekurencyjną
Forum PHP.pl > Forum > PHP
Civil
Witam,
Napisałem funkcje rekurencyjną:
  1. function child_counter($child_id)
  2. {
  3. global $level;
  4.  
  5. if($child_id!=0)
  6. {
  7. $level++;
  8. $query6=mysql_query("SELECT categories_id,parent_id from categories where categories_id='$child_id'",$GLOBALS[db]);
  9. $d=mysql_fetch_array($query6);
  10. child_counter($d[1]);
  11.  
  12. }
  13. else
  14. return $level;
  15.  
  16.  
  17.  
  18. }


Do której podaje jako argument id rodzica z tabeli z kategoriami. Tabela jest wzorowana na OSCommerce:

  1. CREATE TABLE IF NOT EXISTS `categories` (
  2. `categories_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `categories_image` varchar(64) DEFAULT NULL,
  4. `parent_id` int(11) NOT NULL DEFAULT '0',
  5. `sort_order` int(3) DEFAULT NULL,
  6. `date_added` datetime DEFAULT NULL,
  7. `last_modified` datetime DEFAULT NULL,
  8. `pos` int(3) NOT NULL,
  9. PRIMARY KEY (`categories_id`),
  10. KEY `idx_categories_parent_id` (`parent_id`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=130 ;
  12.  


Problem w tym, że funkcja po kilku iteracjach gdy dojdzie już do rodzica równego 0 nic nie zwraca. Gdzie może być błąd?
Matte
  1. if ($child_id != 0) {
  2. $level++;
  3. $query6 = mysql_query("SELECT categories_id,parent_id from categories where categories_id='$child_id'", $GLOBALS[db]);
  4. $d = mysql_fetch_array($query6);
  5. child_counter($d[1]);
  6. //Tutaj można by coś zwrócić ;]
  7.  
  8. }else{
  9. return $level;
  10. }

Teraz popatrz ; )
Civil
Dzięki, ale już sobie poradziłem do...while zamiast rekurencją.

  1. function child_counter($child_id)
  2. {
  3. if($child_id!=0)
  4. {
  5.  
  6. do
  7. {
  8. $level++;
  9. $query6=mysql_query("SELECT categories_id,parent_id from categories where categories_id='$child_id'",$GLOBALS[db]);
  10. $d=mysql_fetch_array($query6);
  11. $child_id=$d[1];
  12.  
  13. }while($child_id>0);
  14. }
  15.  
  16. return $level;
  17.  
  18.  
  19.  
  20. }


A tak z ciekawości jeszcze dwie kwestie: w tej rekurencji jest problem z zerowaniem tego levelu - w momencie gdy wywołuje się funkcje wiele raz - unset nie zdaje egzaminu.

A po drugie dlaczego: return musi być po pierwszym if a nie w else? Na logikę przecież: funkcja jest wywoływana jeszcze raz - z parametrem 0 (dochodzi do 0) - wtedy niespełniony jest if i else powinno zwracać? Coś przeoczyłem w moim rozumowaniu?
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.