2009-09-16 2 views
1

Я хочу, чтобы генерировать все комбинации длины г из множества [0 ... (N-1)]PHP сочетание массива

Таким образом, выходной сигнал должен быть таким (п = 6 г = 2)

$res = array(array(0,1),array(0,2),array(0,3),array(0,4),array(0,5),array(1,2),array(1,3),array(1,4),array(1,5),array(2,3),array(2,4),array(2,5),array(3,4),array(3,5),array(4,5)); 

с функцией как

function permutate($select, $max) 

где $ выбрать = г и $ макс = п

это моя нынешняя попытка, но мой мозг d кажется, функционирующими в этот вечер oesnt и он работает только для $ выбора = 2

function permutate($select, $max) 
{ 
    $out = array(); 
    for($i = 0; $i < ($max) ; $i++) 
    { 
     for ($x = ($i + 1); $x < ($max); $x++) 
     { 

      $temp = array($i); 

      for($l = 0; $l < ($select-1); $l++) 
      { 
       if(($x+$l) < $max) 
       {     
        array_push($temp, $x+$l); 
       } 
      }  
      if(count($temp) == $select) 
      { 
       array_push($out, $temp); 
      } 
     } 
    } 

    return $out; 
} 

Заранее спасибо

ответ

4

Так как вам нужно неопределенное количество циклов, вам нужно будет сделать это рекурсивно:

function permutation($select, $max) { 
    if ($select === 1) { 
     $result = range(0, $max); 
     foreach ($result as &$entry) { 
      $entry = array($entry); 
     } 
     return $result; 
    } 
    $result = array(); 
    $previous = permutation($select - 1, $max - 1); 
    foreach ($previous as $entry) { 
     $last = end($entry); 
     for ($i = $last + 1; $i <= $max; $i++) { 
      $result[] = array_merge($entry, array($i)); 
     } 
    } 
    return $result; 
} 
+0

это работает только для $ select = 2, так как при $ select = 3 вы получаете только массив (массив (0,1), массив (0,2) ......); , когда это должно быть массив (массив (0,1,2), массив (0,2,3) ......) – lloydsparkes

+0

О, теперь у меня есть идея! Фиксация ответа ... – soulmerge

+0

да прекрасно работает – lloydsparkes

Смежные вопросы