2012-12-24 21 views

cevap

9

kullanmalıdır. baz içinde

Bu fonksiyon artışlarla

([dizideki elementlerin sayısı]) ve şeritler için karakterleri değiş tokuş etmek için strtr fonksiyonunu kullanır. Sonra

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'; 
} 

...

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

Bu aynı zamanda daha hızlı aşağıda özyinelemeli örnek göre anlamlı gibi görünüyor. Benim sunucuda

kullanma microtime() bu kod 0,072862863540649 saniye

özyinelemeli Aşağıdaki örnek ,39673089981079 saniye sürer çalışır.

% 138 daha hızlı!

+1

Bu mükemmel çalışıyor - Teşekkürler! – user1926784

+1

Bu, harika bir kod parçasıdır. +1 – Peter

4

Sen Burada başka bir yolu bir özyinelemeli fonksiyon

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

Internet'te, aslında ihtiyacım olanı yapan tek yöntem bu! – Dejv

İlgili konular