0

I have this multidimensional array of which I wish to calculate the various combinations of the elements of the array. Here is the array:

$komponenten = array(
"Rrahmen" => array(
    "Laenge" => array("400", "500"),
    "Breite" => array("400", "500"),
    "Hoehe" => array("400", "500"),
    "Material" => array("Aluminium Eloxiert"),
    "Farbe" => array("Schwarz", "Silber"),
    "Gehaeuseverkleidung" => array("Ja", "Nein")
),

"Druckbett" => array(
    "Laenge" => array("400", "500"),
    "Breite" => array("400", "500"),
    "Hoehe" => array("400", "500")
),

"Druckkopf" => array(
    "Anzahl Druckmaterielien" => array("1", "2"),
    "Filament" => array("ABS", "PLA"),
    "Filamen Groesse" => array("1.7", "3.0")
),

"Schnittstelle" => array(
    "USB" => array("Ja", "Nein"),
    "LAN" => array("Ja", "Nein"),
    "WLAN" => array("Ja", "Nein"),
    "Bluetooth" => array("Ja", "Nein"),
    "SD Card" => array("Ja", "Nein")
),

"Accessories" => array(
    "Energieversorgung" => array("12V", "24V"),
    "Zustellung" => array("Aufgebaut", "Bausatz")
)

);

Here are two expected possible combinations (each combination has the same number of elements, only the final attributes do change ...). Any help wii be very much apreciated!

[1] = array(
"Rrahmen" => array(
    "Laenge" = 400,
    "Breite" = 400,
    "Hoehe" = 400,
    "Material" = "Aluminium Eloxiert",
    "Farbe" ="Silber",
    "Gehaeuseverkleidung" = "Nein"
),

"Druckbett" => array(
    "Laenge" = "500",
    "Breite" = "400",
    "Hoehe" = "500"
),

"Druckkopf" => array(
    "Anzahl Druckmaterielien" = 1,
    "Filament" = "ABS",
    "Filamen Groesse" = 3.0
),

"Schnittstelle" => array(
    "USB" = "Ja",
    "LAN" = "Nein",
    "WLAN" = "Nein",
    "Bluetooth" = "Nein",
    "SD Card" = "Nein",
),

"Accessories" => array(
    "Energieversorgung" = "24V",
    "Zustellung" = "Aufgebaut"
)

[2] = array(
"Rrahmen" => array(
    "Laenge" = 400,
    "Breite" = 500,
    "Hoehe" = 400,
    "Material" = "Aluminium Eloxiert",
    "Farbe" ="Schwarz",
    "Gehaeuseverkleidung" = "Ja"
),

"Druckbett" => array(
    "Laenge" = "500",
    "Breite" = "500",
    "Hoehe" = "500"
),

"Druckkopf" => array(
    "Anzahl Druckmaterielien" = 1,
    "Filament" = "ABS",
    "Filamen Groesse" = 3.0
),

"Schnittstelle" => array(
    "USB" = "Ja",
    "LAN" = "Nein",
    "WLAN" = "Nein",
    "Bluetooth" = "Nein",
    "SD Card" = "Nein",
),

"Accessories" => array(
    "Energieversorgung" = "24V",
    "Zustellung" = "Aufgebaut"
)
Dorogz
  • 13
  • 1
  • 5
  • A partial solution can be found [here](https://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays/15973172#15973172). How could I extend this solution to accommodate deeper arrays? – Dorogz Feb 27 '18 at 11:15

1 Answers1

0

I split the array into single arrays as such

$rahmen = array(
    "Laenge" => array("400", "500"),
    "Breite" => array("400", "500"),
    "Hoehe" => array("400", "500"),
    "Material" => array("Aluminium Eloxiert"),
    "Farbe" => array("Schwarz", "Silber"),
    "Gehaeuseverkleidung" => array("Ja", "Nein")
);

$druckbett = array(
    "Laenge" => array("400", "500"),
    "Breite" => array("400", "500"),
    "Hoehe" => array("400", "500")
);

$druckkopf = array(
    "Anzahl Druckmaterielien" => array("1", "2"),
    "Filament" => array("ABS", "PLA"),
    "Filamen Groesse" => array("1.7", "3.0")
);

$schnittstelle = array(
    "USB" => array("Ja", "Nein"),
    "LAN" => array("Ja", "Nein"),
    "WLAN" => array("Ja", "Nein"),
    "Bluetooth" => array("Ja", "Nein"),
    "SD Card" => array("Ja", "Nein")
);

$accessories = array(
    "Energieversorgung" => array("12V", "24V"),
    "Zustellung" => array("Aufgebaut", "Bausatz")
);


$components = array(
    "Rahmen" => $rahmen, 
    "Druckbett" => $druckbett, 
    "Druckkopf" => $druckkopf, 
    "Schnittstelle" => $schnittstelle, 
    "Accessories" => $accessories);

$components = array("Rahmen", "Druckbett", "Druckkopf", "Schnittstelle", "Accessories");

and used the following function to attain a solution:

function cartesian(array $input)
    {
        $result = [[]];
        foreach ($input as $key => $values) {
            $append = [];
            foreach ($values as $value) {
                foreach ($result as $data) {
                    $append[] = $data + [$key => $value];
                }
            }
            $result = $append;
        }

        return $result;
    }


$print1 = cartesian($rahmen);

$print2 = cartesian($druckbett);

$print3 = cartesian($druckkopf);

$print4 = cartesian($schnittstelle);

$print5 = cartesian($accessories);

$prints = array($print1, $print2, $print3, $print4, $print5);

$print = array_combine($components, $prints);

echo "<pre>";
print_r($print);

//print_r(cartesian($print));
echo "</pre>";
Dorogz
  • 13
  • 1
  • 5