Alle Varianten von mehreren Arrays

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

  • Alle Varianten von mehreren Arrays

    Guten Morgen

    Ich habe oft 2 Arrays was jedoch auch mehr werden können. Gibt es eine möglichkeit, dass er mir alle möglichkeiten bei der Kombination bietet?
    Also so:
    Array 1 = Apfel, Birne, Banane
    Array 2= Gelb, Rot, Grün
    Nun hätte ich gerne einen neuen Array mit:
    Apfel Gelb
    Apfel Rot
    Apfel Grün
    Birne Gelb
    Birne Rot
    Birne Grün
    Banane ....

    Bei 3 oder mehr arrays das selbe.

    Wie könnte ich dies am einfachsten lösen?

    Gruss und Danke für eure Hilfe.

    Koda

  • #2
    Das Zauberwort heißt: Permutation
    Wir werden alle sterben

    Kommentar


    • #3
      Hi

      Vielen Dank. Aber ist das wirklich das richtige? Ich habe da gestern bereits gesucht und bin auf folgendes Ergebnis gekommen:
      Einerseits geht es bei mir ja um mehrere arrays und nicht um einen. Andererseits wenn wir von den drei Zahlen 1, 2 und 3 ausgehen ergeben sich durch die Permutation folgende Möglichkeiten:
      1, 3, 2
      2, 1, 3
      2, 3, 1
      3, 1, 2
      3, 2, 1
      und weitere (Stammt aus einem Beispiel in einem Forum)

      Wenn wir nochmals mein Beispiel fertig machen:
      Array 1 = Apfel, Birne, Banane
      Array 2= Gelb, Rot, Grün
      Nun hätte ich gerne einen neuen Array mit:
      Apfel Gelb
      Apfel Rot
      Apfel Grün
      Birne Gelb
      Birne Rot
      Birne Grün
      Banane Gelb
      Banane Rot
      Banane Grün

      Gelb Apfel ist dann keine Lösung mehr.

      Man könnte es eigentlich mit Produktmerkmalen vergleichen.
      Wenn wir hier drei arrays haben:
      Array1 (Farbe): Rot, Grün, Blau
      Array2 (Grösse): 40, 42, 44
      Array3 (Material): Seide, Baumwolle
      Wenn ich dann als Kombi "Rot, 40, Seide" erhalte benötige ich nicht auch noch "Seide, Rot, 40"
      Die Arrayanzahl ändert sich auch immer

      Sorry ist etwas kompliziert geschrieben nehm ich mal an.

      Gruss

      Koda

      Kommentar


      • #4
        Ich denke schon, dass das eine Permutation ist.
        Bei der einen Variante werden die Positionen der Elemente vertauscht.
        Bei er anderen wird über das mögliche erscheinen permutiert.
        Ein Shirt kann eben nur eine Größe haben.


        Wenn ich dir hier den Code vorkaue, dann lernst du nix, befürchte ich.
        Aber ich mache das trotzdem mal.....


        PHP-Code:
        <?php
        error_reporting
        (-1);
        ini_set('display_errors'TRUE); 



        class 
        Perm2Dim implements CountableArrayAccessIterator
        {
           private 
        $array = array();
           private 
        $count 0;
           private 
        $pos   0;

           public function 
        __construct(Array $array)
           {
             
        $array array_values($array); // normalisieren
             
        foreach($array as $index => $teilarray)
             {
               if(!
        is_array($teilarray))
                 throw new 
        InvalidArgumentException('Only Arrays allowed',1);
               if(
        count($teilarray) < 1)
                 throw new 
        InvalidArgumentException("Too few Elements in Subarray $index",2);
               
        $this->array[$index]['data']  = array_values($teilarray); // normalisieren
               
        $this->array[$index]['fence'] = 1;
               
        $this->array[$index]['count'] = count($teilarray);
               for(
        $i=0;$i<$index;$i++)   $this->array[$i]['fence'] *= $this->array[$index]['count'];
             }
             
        $temp 1;
             for (
        $i=count($this->array)-1;$i>0;$i--)
             {
               
        $temp *= $this->array[$i]['count'];
               
        $this->array[$i-1]['fence'] =  $temp;
             }

             
        $this->count $this->array[0]['fence']*$this->array[0]['count'];
             if(!
        is_int($this->count))
              throw new 
        InvalidArgumentException('Too many elements for Integer Count',3);
           }

           public function 
        offsetGet($index)
           {
             if(!
        $this->offsetExists($index))
               throw new 
        InvalidArgumentException('Offset out of Range',4);
             
        $result = array();
             foreach(
        $this->array as $teilarray)
             {
               
        $result[] = $teilarray['data'][floor($index/$teilarray['fence'])];
               
        $index    $index $teilarray['fence'];
             }
             return 
        $result;
           }

           private function 
        has($index)
           {
             return 
        $index >= && $index $this->count;
           }

           public function 
        offsetExists($index)
           {
             return 
        $this->has($index);
           }

           public function 
        valid()
           {
             return 
        $this->has($this->pos);
           }

           public function 
        count()
           {
             return 
        $this->count;
           }

           public function 
        rewind()
           {
             
        $this->pos 0;
           }

           public function 
        current()
           {
             return 
        $this[$this->pos];
           }

           public function 
        key()
           {
             return 
        $this->pos;
           }

           public function 
        next()
           {
             
        $this->pos++;
           }

           public function 
        getall()
           {
             return 
        $this->array;
           }

           public function 
        offsetSet($index,$newval)
           {
             throw new 
        Exception('Setter not implemented',5);
           }

           public function 
        offsetUnset($index)
           {
             throw new 
        Exception('Unsetter not implemented',6);
           }
        }


        //--------



        $farbe    = array('rot','blau','gelb',);
        $groesse  = array('36','38','40',);
        $material = array('Seide''Baumwolle',);


        $permutator = new Perm2Dim(array($groesse,$material,$farbe));

        echo 
        "Es gibt "count($permutator), " Produkte<br>";
        echo 
        "Das erste Produkt ist: ",  implode(',',$permutator[0]), " <br>";


        foreach(
        $permutator as $index => $data)
          echo 
        "$index: "implode(',',$data), '<br>';
        Zuletzt geändert von combie; 17.05.2013, 08:29.
        Wir werden alle sterben

        Kommentar


        • #5
          Zitat von combie Beitrag anzeigen
          Ich denke schon, dass das eine Permutation ist.
          Bei der einen Variante werden die Positionen der Elemente vertauscht.
          Bei er anderen wird über das mögliche erscheinen permutiert.
          Ein Shirt kann eben nur eine Größe haben.


          Wenn ich dir hier den Code vorkaue, dann lernst du nix, befürchte ich.
          Aber ich mache das trotzdem mal.....
          Hallo combie

          Was heisst hier nichts lernen? Ich wäre im leben nicht auf sowas komplexes (für mich zumindest) gekommen

          Du bist toll vielen Dank

          Gruss

          Koda

          Kommentar

          Lädt...
          X