2012-12-24 15 views

risposta

9

Ecco un altro modo.

Questa funzione incrementi nella base ([numero di elementi dell'array])

e utilizza la funzione strtr di scambiare i caratteri per le stringhe.

function everyCombination($array) { 

    $arrayCount  = count($array); 
    $maxCombinations = pow($arrayCount, $arrayCount); 
    $returnArray  = array(); 
    $conversionArray = array(); 

    if ($arrayCount >= 2 && $arrayCount <= 36) 
    { 
     foreach ($array as $key => $value) { 
      $conversionArray[base_convert($key, 10, $arrayCount)] = $value; 
     } 

     for ($i = 0; $i < $maxCombinations; $i++) { 
      $combination = base_convert($i, 10, $arrayCount); 
      $combination = str_pad($combination, $arrayCount, "0", STR_PAD_LEFT); 
      $returnArray[] = strtr($combination, $conversionArray); 
     } 

     return $returnArray; 
    } 

    echo 'Input array must have between 2 and 36 elements'; 
} 

Poi ...

print_r(everyCombination(array('a', 'b', 'c', 'd'))); 

Questo sembra anche essere significativamente più veloce rispetto all'esempio ricorsivo di seguito.

Utilizzando microtime() sul mio server di questo codice viene eseguito in 0.072862863540649 secondi

L'esempio ricorsivo di seguito prende 0.39673089981079 secondi.

138% più veloce!

+1

Funziona perfettamente - Grazie! – user1926784

+1

Questo è un grande pezzo di codice. +1 – Peter

4

si dovrebbe usare una funzione ricorsiva

function perm($arr, $n, $result = array()) 
{ 
    if($n <= 0) return false; 
    $i = 0; 

    $new_result = array(); 
    foreach($arr as $r) { 
    if(count($result) > 0) { 
     foreach($result as $res) { 
       $new_element = array_merge($res, array($r)); 
       $new_result[] = $new_element; 
      } 
     } else { 
      $new_result[] = array($r); 
     } 
    } 

    if($n == 1) return $new_result; 
    return perm($arr, $n - 1, $new_result); 
} 

$array = array('a', 'b', 'c', 'd'); 
$permutations = perm($array, 4); 
print_r($permutations); 
+1

Questo è l'unico metodo trovato su Internet che effettivamente fa ciò di cui ho bisogno! – Dejv

Problemi correlati