Получите все возможные комбинации (или перестановки) из многомерного массива, используя переполнение стека

У меня есть этот многомерный массив, из которого я хочу вычислить различные комбинации элементов массива. Вот массив:

$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")
)

);

Вот две ожидаемые возможные комбинации (каждая комбинация имеет одинаковое количество элементов, только конечные атрибуты меняются …). Любая помощь будет очень признательна!

[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")

0

Решение

Я разделил массив на отдельные массивы как таковые

$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");

и использовал следующую функцию для достижения решения:

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>";
0

Другие решения

Других решений пока нет …