Array Permutationen in mehrdimensionales array, halten Sie die Tasten PHP
Seit zwei Tagen habe ich ausgeführt wurde verrückt versucht, um dies zu erreichen, vielleicht können Sie mich aufklären. Dies ist für ein Pferd Wetten permutation. Jedes mal, wenn ein user spielt, bekomme ich ein mehrdimensionales array (2 Stufen). Die erste Ebene enthält die race-ID, die in der zweiten Ebene stehen dir Pferde ausgewählt, indem der Benutzer für das Rennen. Es sieht wie folgt aus:
$play = array
(
'4' => array(7, 32),
'8' => array(4),
'2' => array(9),
'12' => array('5'),
'83' => array('10', '11', '12', ''),
'9' => array('3'),
);
Muss ich wissen, was sind alle möglichen Kombinationen für die, die spielen. Das ist leicht getan mit dieser Funktion:
function permutations(array $array)
{
switch (count($array)) {
case 1:
return $array[0];
break;
case 0:
throw new InvalidArgumentException('Requires at least one array');
break;
}
$a = array_shift($array);
$b = permutations($array);
$return = array();
foreach ($a as $key => $v) {
if(is_numeric($v))
{
foreach ($b as $key2 => $v2) {
$return[] = array_merge(array($v), (array) $v2);
}
}
}
return $return;
}
Dieser gibt ein array mit allen möglichen Kombinationen schön. So weit, So gut, und das Ergebnis sieht wie folgt aus:
Array
(
[0] => Array
(
[0] => 7
[1] => 4
[2] => 9
[3] => 5
[4] => 10
[5] => 3
)
[1] => Array
(
[0] => 7
[1] => 4
[2] => 9
[3] => 5
[4] => 11
[5] => 3
)
[2] => Array
(
[0] => 7
[1] => 4
[2] => 9
[3] => 5
[4] => 12
[5] => 3
)
[3] => Array
(
[0] => 32
[1] => 4
[2] => 9
[3] => 5
[4] => 10
[5] => 3
)
[4] => Array
(
[0] => 32
[1] => 4
[2] => 9
[3] => 5
[4] => 11
[5] => 3
)
[5] => Array
(
[0] => 32
[1] => 4
[2] => 9
[3] => 5
[4] => 12
[5] => 3
)
)
Mein problem: ich brauche das array "Schlüssel" für jedes Pferd der "Rasse-ID", nicht 0,1,2,3. Ich muss das Resultat so sein:
Array
(
[0] => Array
(
[4] => 7
[8] => 4
[2] => 9
[12] => 5
[83] => 10
[9] => 3
)
[1] => Array
(
[4] => 7
[8] => 4
[2] => 9
[12] => 5
[83] => 11
[9] => 3
)
[2] => Array
(
[4] => 7
[8] => 4
[2] => 9
[12] => 5
[83] => 12
[9] => 3
)
[3] => Array
(
[4] => 32
[8] => 4
[2] => 9
[12] => 5
[83] => 10
[9] => 3
)
[4] => Array
(
[4] => 32
[8] => 4
[2] => 9
[12] => 5
[83] => 11
[9] => 3
)
[5] => Array
(
[4] => 32
[8] => 4
[2] => 9
[12] => 5
[83] => 12
[9] => 3
)
)
Wie kann ich dies erreichen? Ich weiß, das ist ein langer post, aber ich musste die Grafik dieser. Ich habe Probleme, mich zu wickeln meinem Kopf herum, die Funktion der Rekursion und ich völlig verloren in jeder Schleife.
- Warum sind manche Werte zahlen in Ihre ursprüngliche array und ein paar Streicher? Warum die leere?
- Weil es darum geht, aus einer HTML-Checkboxen-array, so dass der Benutzer kann verlassen einige der Checkboxen leer. Die permutations () - Funktion ignoriert die Werte, die nicht zahlen. Das ist kein problem 🙂
- wie sollte es mit einem Schlüssel bitte fügen Sie einige Beispiele für gültige array Sie auf der Suche nach vorn zu machen.
- Der Letzte code-block enthält die benötigten array-Struktur. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was Sie brauchen. Ich habe kommentiert bei Bedarf:
Sehen Sie es in Aktion.
Durch die Art und Weise, Berechnung aller Permutationen rekursiv ist ordentlich, aber Sie vielleicht nicht wollen, tun Sie es in einer Produktionsumgebung. Sollten Sie auf jeden Fall eine Plausibilitätsprüfung, die berechnet, wie viele Permutationen gibt es, und nicht, damit die Verarbeitung fortgesetzt werden, wenn Sie über einige Grenze, zumindest.
Ich habe das gleiche problem und Danny ' s Lösung war nicht gut für mich.
Ich verwalte Tausende von permutation und speichern Sie Sie im Speicher ist verdammt teuer.
Hier meine Lösung:
Wenn jemand eine bessere Idee, die ich hier bin!
Ich verbesserte Jon-Funktion durch die Zusammenlegung seines Algorithmus mit, die ich zunächst hatte. Was ich Tat, war zu überprüfen, ob die Funktion war dabei eine Rekursion, wenn das so ist, ich nutze den original array_merge() (welches), was ich verwenden Jon array_combine() (halten Sie die Felder, Schlüssel).
Ich bin-Kennzeichnung Jon ' s Antwort als richtig, denn er schlug vor eine glatte Lösung, um die array-Schlüssel, intakt.
Erfolgreich getestet mit mehreren array-Kombinationen.