rekursive funktion ohne Wiederholungen
Phil
- php
0 Nachtrag
Phil0 dedlfix
0 peter1 dedlfix0 Also in 2 Funktionen.
Phil1 ChrisB
0 Tom
In einem objekt wird eine Funktion ausgeführt welche
sich rekursiv aufruft um eine Baumstruktur zu erzeugen.
Wie stellt man es an, das ein Befehl nur einmal am
Anfang und ende ausgeführt wird?
In dem Fall um am Anfang und Ende einmalig ein
<ul>
bzw </ul>
anzuhängen ohne durch die Rekursion
Wiederholungen zu generieren?
public function buildTree()
{
Anfang: $Baum = '<ul>'
foreach-Schleife $Baum .= ......
(ruft buildTree()
rekursiv auf)
Ende: $Baum .= '</ul>'
}
Die erste Wiederholungsaussetzung kann ich mir noch über ein
Variablenübergabe vorstellen, die bei der Rekursion übergeben wird.
if($rcsn == FALSE)
{
$Baum = '<ul>';
}
Aber für das Ende?
Hi!
Die erste Wiederholungsaussetzung kann ich mir noch über ein Variablenübergabe vorstellen, die bei der Rekursion übergeben wird.
Aber für das Ende?
Für das Ende ist diese Variable immer noch mit dem selben Wert gefüllt. Die rekursiv aufgerufenen Funktionen haben ihren eigenen Gültigkeitsbereich und überschreiben die lokalen Variablen (inklusive Parameter) der aufrufenden Funktion nicht.
Lo!
Vielleicht so:
function buildTree()
foreach-Schleife $Baum .= ......
(ruft [code lang=php]buildTree()
~~~ rekursiv auf)
}[/code]
`$Baum = '<ul>';`{:.language-php}
`buildTree();`{:.language-php}
`$Baum .= '</ul>';`{:.language-php}
gruß
peter
Hi!
In einem objekt wird eine Funktion ausgeführt welche sich rekursiv aufruft um eine Baumstruktur zu erzeugen.
Wie stellt man es an, das ein Befehl nur einmal am Anfang und ende ausgeführt wird?
In dem Fall um am Anfang und Ende einmalig ein<ul>
bzw</ul>
anzuhängen ohne durch die Rekursion Wiederholungen zu generieren?
Warum nicht? Wenn du ineinandergeschachtelte Listen bauen willst, brauchst du darin doch auch die ul-Elemente.
Ansonsten wäre es vielleicht sinniger, die ul-Elemente außerhalb der Funktion zu notieren. Oder du verbannst die eigentlich Rekursion in eine Hilfsmethode. Wenn du trotzdem nur eine Methode haben möchtest, musst du dir Gedanken machen, wie du die Information "außen" (da wo Anfang und Ende ist) ermittelst (Level mitzählen) oder überträgst (optionaler Parameter, der beim Erstaufruf true ist und beim Selbstaufruf false übergeben bekommt).
Lo!
Also in 2 Funktionen aufteilen.
habe bis jetzt in eine Variable innerhalb des Objektes geschrieben.
$this->ausg .=
müsste also in die Funktion
buildTree1() übergeben werden. Ist das ein Problem?
Vereinfachte Code: (Parent-Id Modell)
function buildTree1()
{
$Baum = '<ul>';
buildTree();
$ausg .= '</ul>';
return $Baum;
}
private function buildTree($id = 0)
{
$sites = $this->sites; // Array aus DB mit ID , Parent-id etc.
$id_act = $this->pg_id; // Aktuellaktive Seite
$id = (int)$id;
foreach($sites as $row)
{
if($row['pg_parent'] == $id) // Link aktiv?
{
if($row['pg_id'] == $id_act)
{
$this->ausg .= '<li><span style="color: red;">'.$row['pg_lnk_nme'].'</span>';
}
else
{
$this->ausg .= '<li><a href="">'.$row['pg_lnk_nme'].'</a>';
}
if( (in_array($row['pg_id'], $hayst)&&$ext_tree == 0)// parent-id's durchsuchen -> rekursion
{
$this->ausg .= "<ul>\n";
$this->buildTree($row['pg_id']);
$this->ausg .= "</ul>\n";
}
$this->ausg .= "</li>\n";
}
}
}
Hi,
Also in 2 Funktionen aufteilen.
Nein, wozu denn?
Wo dedlfix schon sagte, wirst du doch wohl verschachtelte Listen generieren wollen - also wozu die Generierung der UL-Tags an eine andere Stelle auslagern? Die Darstellung jeder Ebene beginnt und endet mit <ul> bzw. </ul>.
MfG ChrisB
Logisch, sehe vor Wald die Bäume nicht.
Die Umstellung auf OOP überlastet gerade mein Hirn.
Vielen Dank für Eure Hilfestellungen!
Also in 2 Funktionen aufteilen.
Nein, wozu denn?
Wo dedlfix schon sagte, wirst du doch wohl verschachtelte Listen generieren wollen - also wozu die Generierung der UL-Tags an eine andere Stelle auslagern? Die Darstellung jeder Ebene beginnt und endet mit <ul> bzw. </ul>.
MfG ChrisB
Hello,
In einem objekt wird eine Funktion ausgeführt welche
sich rekursiv aufruft um eine Baumstruktur zu erzeugen.
Irgendwie gehen meine Posts in der letzten Zeit immer verloren.
Also hier nur nochmal der Link auf eine Lösungsmöglichkeit, wie ich sie mal gebastelt habe
http://selfhtml.bitworks.de/forum/get_thread_titles_05.php
Die anderen Gedanken sind jetzt leider weg...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg