2012-04-13 14 views
1

Ich habe eine PHP-Seite mit zwei Variablen: $nbRank und $nbNumeric. Abhängig von diesen beiden Variablen möchte ich ein Array generieren, das alle vorhandenen Kombinationen enthält. Zum Beispiel:Generieren Sie eine Kombination von Zahlen

Wenn $nbRank = 3 und $nbNumeric = 2 hätte ich:

0 0 0 
0 0 1 
0 0 2 
0 1 0 
0 1 1 
0 1 2 
0 2 0 
0 2 1 
0 2 2 
1 0 0 
1 0 1 
1 0 2 
1 1 0 
1 1 1 
1 1 2 
1 2 0 
1 2 1 
1 2 2 
2 0 0 
2 0 1 
2 0 2 
2 1 0 
2 1 1 
2 1 2 
2 2 0 
2 2 1 
2 2 2 

Also, ich verschiedene Schleife und Formeln erstellen um das Endergebnis zu erhalten, aber es funktioniert nicht funktioniert. Das ist, was ich tat:

$result = array(); 

$nbIntRank = 0; 
$nbIntNumeric = 0; 
$nbRank = array(); 
$nbNumeric = array(); 

$nb_rangs = 3; 
$nb_chiffres = 2; 

for ($i = 1; $i <= $nb_rangs; $i++){ 
    $nbRank[$i] = 0; 
} 

$nbIntRank = count($nbRank); 

for ($i = 0; $i <= $nb_chiffres; $i++){ 
    $nbNumeric[$i] = $i; 
} 

$nbIntNumeric = count($nbNumeric); 

$algo = ($nb_rangs * ($nb_chiffres + 1)) * ($nb_rangs * ($nb_chiffres + 1)); 
$nbLine = $algo/($nb_rangs); 

$occ = 0; 
for ($i = 0; $i < $nbLine; $i++){ 
    foreach ($nbRank as $nbrItem => $nbrValue){ 
     $result[$i][] = $nbrValue; 
     $occ++; 
    } 
} 

echo '#############<br />'; 
echo '### DATAS ###<br />'; 
echo '#############<br /><br />'; 

echo '- Nb Elements : '.$algo.'<br />'; 
echo '- Nb Lines : '.$nbLine.'<br />'; 
echo '- Nb Valuable Occurency : '.$occ.'<br />'; 

echo '<br /><hr /><br />'; 
echo '##############<br />'; 
echo '### PARSER ###<br />'; 
echo '##############<br /><br />'; 

echo '<pre>'; 
var_dump($result); 
echo '</pre>'; 

ich es geschafft, meine letzte Array mit leeren Werten zu erstellen (81 Werte, in 27 Zeilen aus 3 Elementen), aber es enthält nur 0.

+1

Bitte den vollständigen Code veröffentlichen, die Schleifen einschließlich. –

+0

@AdamLiss Fertig, ich habe den kompletten Quellcode hinzugefügt. –

+1

@amit Ja, es könnte mir helfen, danke !! :) –

Antwort

0

Hier ist eine rekursive Lösung:

$nbRank = 3; 
$nbNumeric = 2; 

function getCombinations ($length, $min, $max, $aStartingCombinations) 
{ 
    if ($length == 1) 
    { 
     return range ($min, $max); 
    } 

    $final = array(); 
    foreach (getCombinations ($length - 1, $min, $max, $aStartingCombinations) as $combination) 
    { 
     for ($i = $min; $i <= $max; $i++) 
     { 
      $final [] = $combination . $i; 
     } 
    } 
    return $final; 
} 

print_r (getCombinations ($nbRank, 0, $nbNumeric, array())); 
+0

Nur ein Semantik-Hinweis: das sind keine Permutationen, das sind mehr Kombinationen [Permutationen sind ohne Wiederholungen, während wir hier Wiederholungen zählen]. Ich kann kein Feedback über den Code geben, da ich mit PHP nicht vertraut bin, also werde ich die Antwort nicht angreifen, sondern einfach eine bessere Terminologie anbieten :) – amit

+0

@amit: Fair genug. In Kombinationen geändert ... – grossvogel

+0

Danke! Es klappt !!!:) –

2

Sie haben angegeben, Sie werden gut mit Pseudo-Code .. Sorry, ich kann keine spezifische Korrektur für Ihren PHP-Code anbieten [wenn diese Antworten erscheinen - sie könnten mehr Aufklärung], aber ich hätte eine recursive Lösung für dieses Problem gewählt.

In jeder Ebene der Rekursion, versuchen Sie alle Möglichkeiten, und rufen Sie die gleiche Funktion, um alle Kombinationen einer kleineren Größe zu finden.

Pseudo-Code:

findCombinations(range,size,sol,resultList): 
    if (size ==0): #base clause 
    resultList.append(copy(sol)) #making a copy of sol and appending it as a solution 
    return 
    for each i in (0,range): 
    sol.append(i) 
    findCombinations(range,size-1,sol,resultList) #recursive invokation, with smaller size 
    sol.deleteLast() #clean up environment before next calls 

Invoke mit findCombinations(3,3,[],resultList) wo [] nur leere Liste ist, und resultList wird die Liste der Kombination halten, wenn der Algorithmus durchgeführt wird. Diese Invokation wird alle Kombinationen der Größe 3 mit Elementen 0, 1, 2 erhalten.

Komplexität Anmerkung: Die Anzahl der Möglichkeiten wächst exponentiell [O (Bereich Größe)], so dass, wenn Sie versuchen, es zum Beispiel mit 20,20 aufrufen - es könnte einige [sehr lange] Zeit in Anspruch nehmen , für jede Lösung.

+0

Danke für Ihre Idee! –

2
$nbRank = 3; 
$nbNumeric = 2; 

foreach (range(0, base_convert(str_pad('', $nbRank, $nbNumeric), $nbNumeric+1, 10)) as $i) { 
    echo str_pad(base_convert($i, 10, $nbNumeric+1), 3, 0, STR_PAD_LEFT) . PHP_EOL; 
} 

Einfache Idee: Was Sie wollen, ist jede Zahl von 0 bis X mit Base $nbNumeric, so einfach konvertieren wir die maximale Anzahl 10 zu stützen, über sie iterieren mit den üblichen 10-basierten Operatoren, und konvertieren Sie es wieder zurück zur Basis $nbNumeric.

Wahrscheinlich besser lesbar, aber in Wirklichkeit genau die gleichen

$nbRank = 3; 
$nbNumeric = 2; 

// Top is "base_convert(222, 3, 10);" and therefore the upper limit 
$top = base_convert(str_pad('', $nbRank, $nbNumeric), $nbNumeric+1, 10); 
for ($i = 0; $i <= $top; $i++) { 
    echo str_pad(base_convert($i, 10, $nbNumeric+1), 3, 0, STR_PAD_LEFT) . PHP_EOL; 
} 
+0

Es funktioniert !! Danke :) –

+0

Sehr interessant, entdeckte ich einige Funktionen, die ich nicht kannte. Vielen Dank ! –

Verwandte Themen