Phil: rekursive funktion ohne Wiederholungen

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>'
}

  1. 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?

    1. 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!

  2. 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
    
  3. 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!

  4. 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";  
    }										  
    }  
    }
    
    1. 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

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      1. 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

  5. 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

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de