Kess: Eine Schleife ärgert mich ;)

Beitrag lesen

Hallo Tom,

Hier mal ein Beispiel : (hoffentlich wird es einigermaßen ordentlich angezeigt)

katid             katname           katvon

1                 suchmaschine        0
2                 löffel              1
3                 zitate              2

Ich lass zuerst nach allen Kategorien suchen, welche
"0" als übergeordnete Kategorie(katvon) hat.

Dabei kommt heraus (als haupkategorie*): suchmaschine (katid=1). Dann wollte ich einfach hingehen und nach dieser Id's ebenfalls suchen (katvon 1).(Dynamisch funktioniert das ja, da der Besucher ja jedesmal eine katid übergibt)

1 suchmaschine* (katvon = 0)

»»  -  2  löffel       (katvon = 1)

-   3  zitate       (katvon = 2)

was du suchst, ist ein rekursiver Aufruf. Du mußt deine Datenbank Suche in eine Funktion packen, die sich selbst wieder aufruft. Das teuflische dabei sind die Variablen. Jede Instanz der Funktion muß ihr eigenes Set von Variablen benutzen, da sie sonst die Werte aus dem vorhergehenden Aufruf überschreiben würde.
In Pel definierst du locale Variablen mit my varname;
Definiere sie innerhalb deiner Funktion, dann haben sie die gleiche Lebensdauer wie die Instanz deiner Funktion.

Hm, das war jetzt etwas trocken. hier ein Beispiel:

suche(0);  # 0 ist Initialwert

sub suche ($) {
  my (katvon) = @_;

suche in Datenbank nach katvon;
  für alle katid {
     suche(katid);
     ...
  }
}

Beim ersten Aufruf von suche wird die Variable katvon mit 0 belegt und alle katid dazu gesucht. Für jede gefundene katid ruf suche sich selbst wieder auf und übergibt die gefundene katid als neuen Wert für katvon.
Durch die Definition von my katvon wird bei jedem erneuten Aufruf von suche katvon nicht etwas überschrieben, sondern es wird jeweile eine neue Variable angelegt, die nur für die Dauer des aktuellen Durchlaufes von Suche existiert. Du kannst dir das wie einen Stapel Zettel vorstellen. Auf jedem Zettel steht der aktuelle Wert von katvon. Bei jedem Aufruf von suche nimmst du einen neuen Zettel , schreibst den aktuellen Wert drauf und legst ihn auf den Stapel. Ist der Durchlauf von suche beendet, dann nimmst du den obersten Zettel wieder fort.

Viele Gruesse
  Kess