So generieren Sie in PHP alle Kombinationen von Elementen in mehreren Arrays
Lesezeit: 8 Minuten
Ich versuche, alle Kombinationen von Elementen in mehreren Arrays zu finden. Die Anzahl der Arrays ist zufällig (dies kann 2, 3, 4, 5 … sein). Die Anzahl der Elemente in jedem Array ist auch zufällig …
Ich möchte ein Array mit 3 x 3 x 2 = 18 Kombinationen generieren:
A1, B1, C1
A1, B1, C2
A1, B2, C1
A1, B2, C2
A1, B3, C1
A1, B3, C2
A2, B1, C1
A2, B1, C2 …
Das Problem besteht darin, eine Funktion mit einer variablen Anzahl von Quellarrays zu erstellen …
Sie möchten immer ein Element von jede einzelne Reihe?
– Ziege
19. Dezember 2011 um 20:30 Uhr
Krzysztof
Hier ist rekursive Lösung:
function combinations($arrays, $i = 0) {
if (!isset($arrays[$i])) {
return array();
}
if ($i == count($arrays) - 1) {
return $arrays[$i];
}
// get combinations from subsequent arrays
$tmp = combinations($arrays, $i + 1);
$result = array();
// concat each array from tmp with each element from $arrays[$i]
foreach ($arrays[$i] as $v) {
foreach ($tmp as $t) {
$result[] = is_array($t) ?
array_merge(array($v), $t) :
array($v, $t);
}
}
return $result;
}
print_r(
combinations(
array(
array('A1','A2','A3'),
array('B1','B2','B3'),
array('C1','C2')
)
)
);
Wie soll ich diese Funktion ändern, wenn ich die eindeutigen Kombinationen für duplizierte Arrays möchte? Zum Beispiel, wenn ich array(‘A1′,’A2′,’A3’), array(‘A1′,’A2′,’A3’), array(‘C1′,’C2’) habe und ich möchte als Ergebnis “A1, A2, C1”, “A1, A3, C1” usw., aber NEIN “A1, A1, C1” ? Außerdem (wenn ich nicht zu viel verlange 😉 {“A1”, “A2”, “C1”} ist es dasselbe wie {“A2”, “A1”, “C1”}, also möchte ich nur 1 Kombination?
Array
(
[0] => Array
(
[1] => White
[4] => Small
)
[1] => Array
(
[1] => White
[5] => Big
)
[2] => Array
(
[2] => Green
[4] => Small
)
[3] => Array
(
[2] => Green
[5] => Big
)
[4] => Array
(
[3] => Blue
[4] => Small
)
[5] => Array
(
[3] => Blue
[5] => Big
)
)
Keine Ahnung, warum jemand anderes dies abgelehnt hat. Diese Lösung funktionierte perfekt für mich und bewahrte Array-Schlüssel so, wie ich es wollte. +1
– Eric Seestrand
16. August 2016 um 18:46 Uhr
Diese Lösung funktionierte perfekt für mich, musste ein wenig optimieren, um mehrere assoziative Arrays zu kombinieren.
– mk1024
7. November 2018 um 18:01 Uhr
Ich mag diese Lösung: https://stackoverflow.com/a/33259643/3163536, aber um die eigentliche Frage zu beantworten (die davon ausgeht, dass Die Anzahl der Elemente jeder Kombination sollte gleich der Anzahl der eingehenden Arrays sein) sollte die Funktion geändert werden:
Wenn die Reihenfolge keine Rolle spielt, handelt es sich um eine Kombination. Wenn die Reihenfolge wichtig ist, handelt es sich um eine Permutation. In diesem Fall handelt es sich um eine Permutation und nicht um eine Kombination.
– Pol Dellaiera
20. Dezember 2016 um 21:01 Uhr
das ist die einfachste lösung
– Clark
27. März 2018 um 21:04 Uhr
Gibt es eine Möglichkeit, dies zu erreichen? array(4) { 'd' => string(1) "E" 'c' => string(1) "C" 'b' => string(1) "B" 'a' => string(1) "A" }
– Gläser
29. März 2018 um 14:36 Uhr
Problemumgehung für meine Frage: Erstellen Sie ein solches Array ['a' => [['key' => 'a', 'value' => 'A'], ['key' => 'a', 'value' => 'n']]]
– Gläser
29. März 2018 um 14:45 Uhr
Nur für den Fall, dass jemand möchte, dass die Elemente des ersten Arrays bei der ersten Verwendung erscheinen array_shift anstatt array_pop bei Zeile 2.
Wenn die Reihenfolge keine Rolle spielt, handelt es sich um eine Kombination. Wenn die Reihenfolge wichtig ist, handelt es sich um eine Permutation. In diesem Fall handelt es sich um eine Permutation und nicht um eine Kombination.
– Pol Dellaiera
20. Dezember 2016 um 21:01 Uhr
das ist die einfachste lösung
– Clark
27. März 2018 um 21:04 Uhr
Gibt es eine Möglichkeit, dies zu erreichen? array(4) { 'd' => string(1) "E" 'c' => string(1) "C" 'b' => string(1) "B" 'a' => string(1) "A" }
– Gläser
29. März 2018 um 14:36 Uhr
Problemumgehung für meine Frage: Erstellen Sie ein solches Array ['a' => [['key' => 'a', 'value' => 'A'], ['key' => 'a', 'value' => 'n']]]
– Gläser
29. März 2018 um 14:45 Uhr
Nur für den Fall, dass jemand möchte, dass die Elemente des ersten Arrays bei der ersten Verwendung erscheinen array_shift anstatt array_pop bei Zeile 2.
– qwertynik
23. Februar um 5:48 Uhr
F.Müller
Hier ist ein Code, der einzigartige Kombinationen aus einer Reihe von Zahlen generiert.
Wenn Sie eine Liste mit Zahlen haben, z 1,3,4,7,12 Sie können Sätze von generieren X Nummern, alle einzigartig, keine sich wiederholenden.
Die erste Funktion arbeitet in PHP 7.4 oder höher, und der zweite verwendet Schlüssel zum Speichern der Werte. Beide funktionieren laut Benchmark sehr gut.
Sie möchten immer ein Element von jede einzelne Reihe?
– Ziege
19. Dezember 2011 um 20:30 Uhr