Toon posts:

[php] recursieve functie en teller probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een recursieve functie om een hierarchische menustuctuur op het scherm te toveren. De onderstaande functie moet een aantal regels weergeven die door een javascriptje gebruikt worden om het menu weer te geven. Dat moet er zo uitzien:
code:
1
Tree[id] = "pageid|parentid|title|link";

Nu is mijn probleem dat ik voor [id] een teller moet hebben die het aantal menu-items weergeeft. Dit krijg ik echter niet voor elkaar. Hier de functie:
PHP:
1
<?function show_menu($id = 0, $subject = 0, $replyto = 0, $count_total = 0) {   $query = mysql_query("SELECT id, title, parent,link FROM pages WHERE parent = $id ORDER BY orderid ASC");   while(list($m_id, $m_subject, $m_replyto, $m_link) = mysql_fetch_row($query)) {     $count_total++;    echo"Tree[$count_total] = \"$m_id|$m_replyto|$m_subject|$m_link\";\n";    show_menu($m_id, $m_subject, $m_replyto, $count_total);  }}?>

De waarde van $count_total moet dus meelopen met het aantal menuitems. Nu is het zo dat $count_total de volgende waarden aanneemt:
code:
1
2
3
4
5
6
7
8
9
10
11
Tree[1] = "1|0|Homepage|";
Tree[2] = "178|1|Info|page.php?id=178";
Tree[3] = "177|1|Products|";
Tree[4] = "184|177|S-Max|page.php?id=184";
Tree[5] = "186|177|M-Max|page.php?id=186";
Tree[4] = "179|1|Contact|page.php?id=179";
Tree[5] = "207|179|E-mail form|page.php?id=207";
Tree[5] = "180|1|Links|";
Tree[6] = "187|180|Link1|page.php?id=187";
Tree[7] = "190|180|Link2|page.php?id=190";
Tree[8] = "191|180|Link3|page.php?id=191";

Heeft iemand een idee hoe ik de waarde $count_total bij ieder menu-item op kan laten lopen?

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

STATIC ?

Klaar voor een nieuwe uitdaging.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

ALs je die functie het aantal items laat terug sturen dan kan je hem bij iedere functie aanroep er weer bij optellen. Het is trouwens wel foeilelijk om een functie meerdere taken te laten vervullen.

pseudo
code:
1
2
3
4
5
6
7
int show(Menu menu){
   int aantal = 1;
   for(int k=0;k<menu.size();k++){
     aantal+= show(menu.get(k));
   }
   return aantal;
}

Verwijderd

Topicstarter
Op woensdag 17 juli 2002 14:55 schreef Alarmnummer het volgende:
ALs je die functie het aantal items laat terug sturen dan kan je hem bij iedere functie aanroep er weer bij optellen. Het is trouwens wel foeilelijk om een functie meerdere taken te laten vervullen.
Dat gebeurt nu toch al? En het gaat om php, zoals je kon zien.
anyway, static deed de truuk. Weer iets geleerd, hier de werkende code:
PHP:
1
<?function show_menu($id = 0, $subject = 0, $replyto = 0, $count_total) {   $query = mysql_query("SELECT id, title, parent,link FROM pages WHERE parent = $idORDER BY orderid ASC");   static $count_total = 0;  while(list($m_id, $m_subject, $m_replyto, $m_link) = mysql_fetch_row($query)) {     $count_total++;    echo"Tree[$count_total] = \"$count_total|$m_replyto|$m_subject|$m_link\";\n";    show_menu($m_id, $m_subject, $m_replyto, $count_total);  }}?>

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op woensdag 17 juli 2002 14:59 schreef Lusch het volgende:

[..]

Dat gebeurt nu toch al? En het gaat om php, zoals je kon zien.
Dat gebeurt niet omdat je een call by value doet ipv een call by reference. Als je in de aangeroepen functie een nieuwe waarde bepaald voor het aantal, dan zal dat in de aanroepende functie nooit zichtbaar worden. Je probleem had je dus kunnen oplossen door er een & teken voor je functie parameter te plaatsen.

 show_menu($m_id, $m_subject, $m_replyto, &$count_total);
  
En verder zijn de basis principes van de meeste prog talen wel behoorlijk hetzelfde, en hier dus ook.

Verwijderd

Als dit hetzelfde menu is dat ik ook gebruik dan hoef je helemaal niet recursief te proggen. Je hebt als het goed is een table. Waarin je een id, mid en verdere velden hebt. Vervolgens laat je dus mid naar id verwijzen. Zo ben je dus recursief in je Db bezig. Dan hoef je alleen maar een simpele output te doen met een order en je vult het ding in een keer! id is het eerste veld in je javascript array, en mid de tweede(uit het hoofd).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op woensdag 17 juli 2002 16:41 schreef voetenzalf het volgende:
Als dit hetzelfde menu is dat ik ook gebruik dan hoef je helemaal niet recursief te proggen. Je hebt als het goed is een table. Waarin je een id, mid en verdere velden hebt. Vervolgens laat je dus mid naar id verwijzen. Zo ben je dus recursief in je Db bezig. Dan hoef je alleen maar een simpele output te doen met een order en je vult het ding in een keer! id is het eerste veld in je javascript array, en mid de tweede(uit het hoofd).
ff goed lezen.

hierarchische menustuctuur

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:41

.oisyn

Moderator Devschuur®

Demotivational Speaker

topictitel gewijzigd (zie [topic=397053])

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Op woensdag 17 juli 2002 16:41 schreef voetenzalf het volgende:
Als dit hetzelfde menu is dat ik ook gebruik ...
En hoe groot is die kans?
Pagina: 1