[Funktion] Funktion die ein kartesisches Produkt zwischen Arrays bildet

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

  • [Funktion] Funktion die ein kartesisches Produkt zwischen Arrays bildet

    Hi,

    ich möchte mehrere Arrays miteinander verknüpfen und sozusagen das kartesisches Produkt von Ihnen bilden.
    Angenommen ich habe ein Array das wie folgt aussieht:
    Code:
    Array
    (
        [0] => Array
            (
                [0] => x1
                [1] => x2
                [2] => x3
                [3] => x4
            )
    
        [1] => Array
            (
                [0] => y1
                [1] => y2
                [2] => y3
            )
    
        [2] => Array
            (
                [0] => z1
                [1] => z2
                [2] => z3
            )
    
    )
    Jetzt möchte ich die werte so miteinander verknüpfen dass ich rausbekomme:
    Code:
    x1y1z1
    x1y1z2
    x1y1z3
    x1y2z1
    x1y2z2
    x1y2z3
    [...]
    x2y1z1
    x2y1z2
    [...]
    x3y1z1
    x3y1z2
    [...]
    Jetzt liegt es nahe zu sagen, ach 3 Arrays, na dann mach halt drei while Schleifen, durchlauf die Arrays bzw Tupel nacheinander und generier das eben.
    Ich möchte aber dass ich beliebig viele Arrays (Tupel) haben kann...

    Ich denke mal das geht am besten per Rekursion, aber wie? Tüftel jetzt schon seit heut morgen daran, und komm leider zu keiner Lösung...

    Vielen Dank schonmal für jede Antwort.

    Grüße

    Dommi

  • #2
    ach 3 Arrays, na dann mach halt drei while Schleifen, durchlauf die Arrays bzw Tupel nacheinander und generier das eben.
    Und bei x arrays benutzt du halt x while-schleifen. Die anzahl herauszufinden dürfte ja nicht schwer fallen

    Kommentar


    • #3
      aber ich weiss doch net vorher wieviele werte ich hab. wenn ich x while schleifen mache, bin ich ja auf diese begrenzt... wenn jetzt ich jetzt mehr als x elemente habe, funktionierts ja nicht mehr.

      Kommentar


      • #4
        Original geschrieben von shihan
        aber ich weiss doch net vorher wieviele werte ich hab. wenn ich x while schleifen mache, bin ich ja auf diese begrenzt...
        du hast doch ein array von arrays - richtig?!
        über $x=count($master_array) hast du ein dynamisches $x.

        Kommentar


        • #5
          shihan: wozu braucht man das denn?

          Kommentar


          • #6
            Hi,

            auf die schnelle...

            PHP-Code:
            <?php

            $test 
            = array(
                  array(
            'x1','x2','x3','x4'),
                  array(
            'y1','y2','y3'),
                  array(
            'z1','z2','z3')
                );

            function 
            cartesian_helper($sofar,$arr,$pos,$max,&$collector){
                  for(
            $i 0$i count($arr[$pos]);$i++){
                     if(
            $pos == $max)
                         
            $collector[] = $sofar.$arr[$pos][$i];
                     else
                          
            cartesian_helper($sofar.$arr[$pos][$i],$arr,$pos+1,$max,$collector);
                  }
            }

            function 
            cartesian($arr){
                
            $bucket = array();
                
            cartesian_helper('',$arr,0,count($arr)-1,$bucket);
                return 
            $bucket;
            }

            print_r(cartesian($test));

            ?>
            Ausgabe:
            Code:
            Array
            (
                [0] => x1y1z1
                [1] => x1y1z2
                [2] => x1y1z3
                [3] => x1y2z1
                [4] => x1y2z2
                [5] => x1y2z3
                [6] => x1y3z1
                [7] => x1y3z2
                [8] => x1y3z3
                [9] => x2y1z1
                [10] => x2y1z2
                [11] => x2y1z3
                [12] => x2y2z1
                [13] => x2y2z2
                [14] => x2y2z3
                [15] => x2y3z1
                [16] => x2y3z2
                [17] => x2y3z3
                [18] => x3y1z1
                [19] => x3y1z2
                [20] => x3y1z3
                [21] => x3y2z1
                [22] => x3y2z2
                [23] => x3y2z3
                [24] => x3y3z1
                [25] => x3y3z2
                [26] => x3y3z3
                [27] => x4y1z1
                [28] => x4y1z2
                [29] => x4y1z3
                [30] => x4y2z1
                [31] => x4y2z2
                [32] => x4y2z3
                [33] => x4y3z1
                [34] => x4y3z2
                [35] => x4y3z3
            )
            (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

            Kommentar

            Lädt...
            X