Verschachtelte Schleifen mit unbekannter Tiefe

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

  • Verschachtelte Schleifen mit unbekannter Tiefe

    Hallo,

    wie kann man Schleifen verschachteln, wenn man nicht vorher weiß, wie viele Ebenen es gibt? Wenn man es vorher weiß, ist es ja kein Problem.

    Beispiel:

    Es gibt zwei Arrays, $farben und $groessen. Nun soll für jede mögliche Kombination ein Preis angegeben werden können.

    PHP-Code:
    foreach ($farben as $farbkey=>$farbwert) {
      foreach (
    $groessen as $grokey=>$growert) {
        echo 
    $farbwert.' - '.$growert;
      }

    Der Benutzer hat aber die Möglichkeit, noch weitere Variationen anzulegen, z. B. Zustand oder Ausführung oder was weiß ich.

    Wenn der Benutzer also noch 5 weitere Variationen anlegt, müssen folglich insgesamt 7 Schleifen ineinander verschachtelt werden.

    Wie löst man sowas? Meine einzige bisher mögliche Lösung ist, die Variationen auf z. B. max. 20 zu begrenzen. Anschließend 20 ineinander verschachtelte Schleifen zu bauen, wobei vor jeder abgefragt wird, ob für sie überhaupt werte vorliegen. Also so:

    PHP-Code:
    # Dynamische Generierung aus DB-Werten, die vom Benutzer erstellt wurden
    $varianten[1]=array('S','M','L');
    $varianten[2]=array('blau','rot','grün');
    $varianten[3]=array('neu','gebraucht');

    # Schleifen
    if ($varianten[1]) {
      foreach(
    $varianten[1] as $x=>$y) {
        if (
    $varianten[2]) {
         foreach(
    $varianten[2] as $a=>$b) {
           if (
    $varianten[3]) {

    ... 
    Aber das ist wohl die hässlichste Lösung, die es gibt. Kann mir jemand auf die Sprünge helfen?

    Schöne Grüße,

    pb

  • #2
    schon mal das zauberwort "rekursion" gehört?
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Natürlich. Aber wie ich es bei sowas anwenden soll, entzieht sich meinem Denkvermögen.

      Kommentar


      • #4
        rekursiv eben. ;-)
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Da es sich scheinbar um einen Shopansatz o.ä handelt würde ich mir eher die Struktur der Datenbank zu gemüte führen.

          Mir fällt gerade nichts ein was mit einer Relationalen Datenbankstruktur nicht zum Ziel führen würde ohne sich die Birne zu zermatern...

          *Wobei ich mich da jetzt nicht festlegen möchte*
          gruss Chris

          [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

          Kommentar


          • #6
            Original geschrieben von plastikbaum
            Natürlich. Aber wie ich es bei sowas anwenden soll, entzieht sich meinem Denkvermögen.
            Nimm dir einen Zettel und einen Stift und male einen Baum!
            hopka.net!

            Kommentar


            • #7
              OffTopic:
              Hopka: http://de.wikipedia.org/wiki/Kunsttherapie ?

              Kommentar


              • #8
                Original geschrieben von plastikbaum
                Natürlich. Aber wie ich es bei sowas anwenden soll, entzieht sich meinem Denkvermögen.
                Na dann, mach dich schlau: http://ffm.junetz.de/members/reeg/DS...00000000000000

                Kommentar


                • #9
                  Original geschrieben von Hopka
                  Nimm dir einen Zettel und einen Stift und male einen Baum!
                  OffTopic:
                  Und ich dachte, sowas müsste man(n) pflanzen, vor oder nach dem Haus bauen und dem Sohn zeugen...


                  @plastikbaum
                  Rekursion heißt in deinem Fall:
                  Du hast n Arrays, für die du alle Kombinationen bilden willst und kennst einen, der das für n-1 Arrays kann.
                  Also nimmst du dir das erste Array von diesem Stapel, sagst dem anderen, er soll die Kombinationen aus den restlichen Arrays bilden und wenn der fertig ist, packst du deins hintendran
                  PHP-Code:
                  function combination($arrays, &$combinations) {
                    
                  //Erstes Element vom Stapel nehmen
                    
                  $first array_shift($arrays);

                    if (
                  count($arrays)) {
                    
                  //Es gibt noch Arrays, aber glücklicherweise kenn ich
                    //einen, der das für den jetzt ja kleineren Stapel kann
                      
                  combination($arrays$combinations);
                    }

                    
                  //Jetzt werden die Elemente, die eben vom 
                    //Stapel genommen wurden hinzugefügt
                    
                  if (!count($combinations)) {
                    
                  //Das Ergebnisarray ist noch leer
                      
                  foreach ($first as $values) {
                      
                  //Für jedes Element, das hinzugefügt werden soll,
                      //wird ein neues Array erzeugt
                        
                  $combinations[] = array($values);
                      }
                    } else {
                    
                  //Das Ergebnisarray ist nicht mehr leer,
                    //jedes Element wird hinter alle schon vorhandenen
                    //geschrieben
                      
                  $new = array();
                      foreach (
                  $combinations as $combination) {
                      
                  //Alle schon vorhandenen Kombination lesen
                        
                  foreach ($first as $value) {
                        
                  //und um die neuen Elemente erweitern
                          
                  $new[] = array_merge($combination$value);
                        }
                      }
                      
                  $combinations $new;
                    }

                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar

                  Lädt...
                  X