PHP Finden Sie Alle (etwas) Einzigartigen Kombinationen eines Arrays
Habe ich PHP-array, permutation /Kombination Fragen den ganzen Tag.. und kann immer noch nicht herausfinden :/
Wenn ich ein array wie:
20 //key being 0
20 //key being 1
22 //key being 2
24 //key being 3
Brauche ich Kombinationen wie:
20, 20, 22 //keys being 0 1 2
20, 20, 24 //keys being 0 1 3
20, 22, 24 //keys being 0 2 3
20, 22, 24 //keys being 1 2 3
Den code, den ich derzeit habe, gibt mir:
20, 22, 24
weil es nicht wollen, wiederholen Sie die 20... aber das ist, was ich brauche!
Hier ist der code, den ich habe. es ist direkt aus Php Rekursion, um alle Möglichkeiten von strings
function getCombinations($base,$n){
$baselen = count($base);
if($baselen == 0){
return;
}
if($n == 1){
$return = array();
foreach($base as $b){
$return[] = array($b);
}
return $return;
}else{
//get one level lower combinations
$oneLevelLower = getCombinations($base,$n-1);
//for every one level lower combinations add one element to them that the last element of a combination is preceeded by the element which follows it in base array if there is none, does not add
$newCombs = array();
foreach($oneLevelLower as $oll){
$lastEl = $oll[$n-2];
$found = false;
foreach($base as $key => $b){
if($b == $lastEl){
$found = true;
continue;
//last element found
}
if($found == true){
//add to combinations with last element
if($key < $baselen){
$tmp = $oll;
$newCombination = array_slice($tmp,0);
$newCombination[]=$b;
$newCombs[] = array_slice($newCombination,0);
}
}
}
}
}
return $newCombs;
}
Ich habe das Spiel mit der ($b == $lastEl)
Linie, mit der kein Glück
===============
Fragen habe ich schon angeschaut, und es sind nicht die gleichen ODER erstellt eine out-of-memory-Fehler!:
- Wie bekomme ich alle Permutationen in PHP ohne fortlaufende Duplikate?
- Permutationen - alle möglichen Sätze von zahlen
- Kombinationen, Anordnungen und Permutationen in PHP
- PHP-array-Kombinationen
- Holen Sie sich alle Permutationen einer PHP-array?
- PHP: Wie man alle möglichen Kombinationen von 1D-array?
- Wählen Sie nur einmalig die array-Werte aus diesem array
- Holen Sie sich alle Permutationen einer PHP-array?
- PHP: Wie man alle möglichen Kombinationen von 1D-array?
- Wählen Sie nur einmalig die array-Werte aus diesem array
- Wie bekomme ich alle Permutationen in PHP ohne fortlaufende Duplikate?
- Algorithmus, um alle Kombinationen von k Elementen aus n
- Finden Kombination(en), Summe des Elements(s) in der Reihe, deren Summe gleich einer gegebenen Zahl ist
- Kombinationen, Anordnungen und Permutationen in PHP
- PHP-array-Kombinationen
- Php Rekursion, um alle Möglichkeiten von strings
- Wie die Rückkehr der Permutationen eines Arrays in PHP?
- Permutationen - alle möglichen Sätze von zahlen
- Subset-sum-problem in PHP mit MySQL
- Finden Sie einzigartige Kombinationen von Werten aus arrays filtern doppelte Paare
- Sie finden die einzigartige Permutationen eines Strings ohne Duplikate erzeugen
- Generieren Sie alle einzigartige Permutationen
- Teilmenge-Summe für genau k ganze zahlen?
Habe ich versucht, einige dieser algorithmen mit einem array mit 12 Elementen, und am Ende läuft out of memory. Aber der Algorithmus, den ich bin derzeit mit nicht geben Sie mir eine " out of memory Fehler.... ABER.. ich brauche diese Duplikate!
- Bitte geben Sie ein gutes Beispiel von Eingabedaten und erwartete Ausgabe.
var_dump()
format passen würde - Endlich fand ich eine rekursive Sache in PHP - bitte siehe meine Antwort...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es Ihnen nichts ausmacht mit ein paar Globale Variablen, Sie könnten das tun, in PHP (übersetzt aus einer version in JavaScript):
AUSGABE:
Den pear package Math_Combinatorics macht diese Art von problem relativ einfach. Es dauert relativ wenig code, es ist einfach und unkompliziert, und es ist ziemlich leicht zu Lesen.
Wenn ich dieses Paket als eine Funktion, ich würde so etwas tun.
Zurückgeben, ein array von arrays. Um den text . . .
Die Idee ist einfach. Angenommen, Sie wissen, wie permutiert, dann speichern Sie diese Permutationen in einer Reihe es wird eine Kombinationen. Legen Sie durch definition kümmert sich um die doppelten Werte. Die Php euqivalent Set oder HashSet ist SplObjectStorage und ArrayList Array. Es sollte nicht schwer zu umschreiben. Ich habe eine Implementierung in Java:
Warum nicht einfach Binär? Zumindest dann seine einfache und sehr einfach zu verstehen, was jede Zeile code hat wie dieser? Hier ist eine Funktion schrieb ich für mich selbst in ein Projekt, von dem ich denke, dass ist Recht ordentlich!
Für dein Beispiel, dieser Ausgänge:
Hatte das gleiche problem und fand eine andere und bitweise, schnellere Lösung:
Dieser erzeugt alle Größe m Kombinationen der zahlen von 0 bis n-1, so zum Beispiel
m = 2, n = 3 und aufrufen Kamm(2, 3) produzieren:
Es gibt Sie, die index-Positionen, so ist es einfach, zeigen Sie auf array-Elemente über index.
Edit: Schlägt mit Eingangs-Kamm(30, 5). Keine Ahnung warum, jemand eine Idee?
Aufgeräumt Adi Bradfield ist sugestion mit strrev und for/foreach-Schleifen, und nur eindeutige Ergebnisse.