Problem mit Rekursion

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Rekursion

    Hey,

    ich habe nachfolgende Datenstruktur in einer Aufgabenstellung gegeben und soll diese Struktur wieder zusammensetzen anhand der diversen Marken wie z.B.
    [Wohnzimmer]

    Dabei soll ich mich aber nicht auf diesen Fall nur beschränken, d.h. es allgemeingültig halten

    Datenstruktur
    Bild


    Bislang bin ich soweit:
    PHP-Code:
    function merge($start_block)
        {
            
    $block $start_block;
            
            if(
    $block['name'] == 'root')
            {
                echo 
    $block['name']."\n";
                
    $c_tpl $block['code'];
            }
            
    /*  
            echo "<pre>";
            print_r($block);
            echo "</pre>";
             */
            
            
    if(isset($block['nested']))
            {
                foreach(
    $block['nested'] as $subblock)
                {
                    echo 
    $subblock['name']."\n";
                    
    $c_tpl preg_replacesprintf($this->bl_pattern,$subblock['name']),$subblock['code'],$c_tpl );
                    
    $this->merge($subblock);
                    
                }
            }
            return 
    $c_tpl;
            
        } 
    Meine erhaltene Ausgabe ist:
    Code:
    root Haus Wohnzimmer Schrank Safe Schlafzimmer Hallo ich bin Max Mustermann und zeige Ihnen nun mein Haus [Haus]
    Und hier sieht man das Problem auch, ich scheitere daran die Marke [Haus] mit dem entsprechenden Block auszutauschen.

    Wenn ich den rekursiven Aufruf nach vorne verlagere wird das ganze in umgekehrter Reihenfolge ausgegeben, was ich vermutlich auch tun muss.

    Soweit ich das verstehe muss ich irgendwie den inneren Block mit der Marke im äusseren Block vertauschen.....

    Aber das bekomm ich nicht hin

  • #2
    Als Ansatz:
    Gib der Merge-Funktion zwei parameter:
    merge($code,$nested);

    EDIT:
    ggf. könntest du auch mal die Array-Struktur mit var_export() hier posten.


    Im Übrigen könnte die Struktur natürlich besser sein.
    Zuletzt geändert von TobiaZ; 14.09.2008, 21:19.

    Kommentar


    • #3
      Bin mal wieder zu gütig und hab dir prompt die Hausaufgaben gemacht. Mein TipJar freut sich...

      PHP-Code:
      function merge($text,$nested)
      {
          
          foreach(
      $nested as $n)
          {
          
              if(isset(
      $n['nested']) && is_array($n['nested']))
                  
      $n['code'] = merge($n['code'],$n['nested']);
                  
              
      $text str_replace('[' $n['name'] . ']',$n['code'],$text);
              
          }
          
          return 
      $text;
          

      Kommentar


      • #4
        Wow, kein wunder dass heute das Wetter so schön ist ... TobiaZ gibt freiwillig fettiche Code

        Kommentar


        • #5
          Danke @TobiaZ für deine Bemühungen....

          Sorry das ich erst so spät reinschaue, habe ehrlich gesagt nicht erwartet eine Musterlösung zu erhalten.

          Jedoch war dein Tipp mit dem zusätzlichen Parameter schon ausreichend.....

          Nach einigem hin und her überlegen kam ich auf folgende Lösung:

          PHP-Code:
          function merge($start_block,$code "")
              {
                  
          $block $start_block;
                  
                  if(
          $block['name'] == 'root')
                      
          $c_tpl $block['code'];
                  else
                      
          $c_tpl $code;
                  
                  if(isset(
          $block['nested']))
                  {
                      foreach(
          $block['nested'] as $subblock)
                      {
                          if( 
          in_array($subblock['name'],$this->regblocks) )
                              
          $temp preg_replacesprintf($this->rep_pattern,$subblock['name']),$subblock['code'],$c_tpl );
                          else
                              
          $temp preg_replacesprintf($this->rep_pattern,$subblock['name']),"",$c_tpl );
                          
          $c_tpl =     $this->merge($subblock$temp);
                          
                      }
                  }
                  return 
          $c_tpl;
                  
              } 
          Ich hab das ganze mittlerweile noch etwas verfeinert, jetzt ist es möglich die Ebenen abhängig voneinander auszublenden.

          Das ist allerdings erst die zweite von 3 Hürden.....

          In der letzten Teilaufgabe muss ich noch die einzelnen Ebenen abhängig voneinander realisieren können, denn es gibt Menschen die haben 2 Häuser, wovon eines komplett leer ist und das andere 2 Schlafzimmer besitzt.

          Ziel ist es im Grunde genommen mittels einer Liste sich solche Modelle erstellen zu können....

          Also aus
          1. Variante: Haus, Wohnzimmer, Wohnzimmer, Schrank, Safe, Wohnzimmer, Safe, Safe
          2. Varainte: Haus
          3. Varainte: Haus, Wohnzimmer, Schrank, Schlafzimmer

          Die Varianten sind exemplarisch genannt und sollen nicht als Spezialfall gesehen werden, es wird explizit eine allgemeine Lösung verlangt....

          Ich habe mir überlegt in einem Array alle ankommenden Objekte fortlaufend zu übernehmen und diese Liste vielleicht über den Index durchzugehen.

          Allerdings stellt sich nun die Frage wie ich innerhalb der Rekursion meine aktuelle Blocknr bestimme....

          Hier fehlt mir allgemein der Ansatz......

          Hättest du möglicherweise eine Idee wie ich das einfach realisieren könnte?
          Dann könnte ich mich daran versuchen

          Original geschrieben von TobiaZ
          Mein TipJar freut sich...
          Was meinst du damit?
          Zuletzt geändert von wurzelsepp; 15.09.2008, 00:56.

          Kommentar


          • #6
            Vorgehensweise bei spezieller Ausgabe eines Multi Dim Arrays

            Hey,

            Bild

            ich möchte obiges Array in bestimmten Ebenen duplizieren oder auch teilweise ausblenden und dann wiederrum zu einem reinen Text wieder zusammenbauen


            Meine Wunschausgabe (zusammengebaut) sieht folgendermaßen aus:
            Blöcke:

            root
            Wohnzimmer
            Wohnzimmer
            Schrank
            Safe
            Wohnzimmer
            Schrank
            Wohnzimmer
            Schrank
            Schrank
            Wohnzimmer
            Schlafzimmer
            Schlafzimmer

            Ich zerbreche mir den Kopf wie ich
            a) an meiner rekursiven Funktion ansetze, die alles wieder zusammenbaut

            und

            b) wie der Benutzer eine solche fortlaufende Liste übergeben kann und daraus dann ein wie oben in der Ausgabe beschriebenes Schleifenmodell besteht....

            Die Regeln wie das zusammengebaut wird gibt ja das Array vor und dem muss ich jetzt noch sagen wie er was entsprechend wiederholen soll...

            Die rek. Funktion die das zusammenbaut ist folgende:
            PHP-Code:
            function merge($start_block,$code "")
                {
                    
            $block $start_block;
                    
                    if(
            $block['name'] == 'root')
                        
            $c_tpl $this->replace_vars('root',$block['code']);
                    else
                        
            $c_tpl $code;
                    
                    if(isset(
            $block['nested']))
                    {
                        foreach(
            $block['nested'] as $subblock)
                        {
                            
            //if( in_array($subblock['name'],$this->regblocks) )
                            
            if( isset($this->regblocks[$subblock['name']]) )
                                
            $temp preg_replacesprintf($this->rep_pattern,$subblock['name']),$this->replace_vars($subblock['name'],$subblock['code']),$c_tpl );
                            else
                                
            $temp preg_replacesprintf($this->rep_pattern,$subblock['name']),"",$c_tpl );
                            
            $c_tpl =     $this->merge($subblock$temp);
                            
                        }
                    }
                    return 
            $c_tpl;
                    
                } 
            wobei diese nur von dem Fall ausgeht jeder Block existiert nur einmal und ist entweder vorhanden oder nicht vorhanden

            Ich bedanke mich im Vorfeld für entsprechende Ideen die mir helfen meine Aufgabe zum Erfolg zu bringen

            Kommentar

            Lädt...
            X