2013-09-01 3 views
1

Я написал нижеприведенную функцию, которая берет массив и выводит все его комбинации.Создайте все комбинации массива с заданным количеством слотов в PHP

$option = array("a","b","c"); 

function combinations($array, $number) { 
    if ($number == 1) { 
     foreach ($array as $k => $v1) { 
      echo $v1 . "<br>"; 
     } 
    } elseif ($number == 2) { 
     foreach ($array as $k => $v1) { 
      foreach ($array as $key => $v2) { 
       echo $v1 . " - " . $v2 . "<br>"; 
      } 

     } 
    } elseif ($number == 3) { 
     foreach ($array as $k => $v1) { 
      foreach ($array as $key => $v2) { 
       foreach ($array as $key => $v3) { 
        echo $v1 . " - " . $v2 . " - " . $v3 . "<br>"; 
       } 
      } 
     } 
    } 
} 

combinations($option, 2); 

выход:

a - a 
a - b 
a - c 
b - a 
b - b 
b - c 
c - a 
c - b 
c - c 

Он принимает число в качестве аргумента и возвращает либо 1, 2 или 3 слота для комбинации. Однако я не знаю заранее, сколько слотов будет для этой комбинации. В большинстве случаев это может быть от 1 до 3, но я надеялся, что есть способ переписать это, чтобы он мог справиться с любым количеством слотов.

Я новичок в PHP, поэтому я уверен, что есть что-то простое, что мне не хватает. Я был бы очень признателен, если бы кто-нибудь мог указать мне в правильном направлении.

Update:

Я не уверен, как это дубликат php string permutation. Если я правильно понимаю их вопрос, они хотят сделать комбинацию из 4 слотов. Я мог бы выполнить это с другим elseif-блоком в функции. Я ищу способ сделать эту работу любым количеством слотов. Приносим извинения, если я неправильно понял.

ответ

0
$option = array("a", "b"); 

function combinations($option, $number) { 
    $combo = array_fill(0, $number, 0); 
    $num_option = count($option); 

    while (true) { 
     // output the combination 
     $output = array_fill(0, $number, 0); 
     for ($i = 0; $i < $number; ++$i) { 
      $output[$i] = $option[$combo[$i]]; 
     } 
     echo implode(" - ", array_reverse($output)) . "<br>"; 

     // compute next combination 
     $incpos = 0; 
     while ($combo[$incpos] == $num_option-1) { 
      $combo[$incpos++] = 0; 
      if ($incpos >= $number) { 
       // we wrapped around - end 
       return; 
      } 
     } 
     ++$combo[$incpos]; 
    } 
} 

combinations($option, 5); 

Этот код работает путем обработки текущей комбинации в качестве базового N числа с $number цифр, где N равно числу значений в массиве $option. На каждой итерации выписывается комбинация, соответствующая числу, и затем число увеличивается на единицу. Цикл завершается, когда номер base-N обертывается обратно к нулю.

Результат:

a - a - a - a - a 
a - a - a - a - b 
a - a - a - b - a 
a - a - a - b - b 
a - a - b - a - a 
a - a - b - a - b 
a - a - b - b - a 
a - a - b - b - b 
a - b - a - a - a 
a - b - a - a - b 
a - b - a - b - a 
a - b - a - b - b 
a - b - b - a - a 
a - b - b - a - b 
a - b - b - b - a 
a - b - b - b - b 
b - a - a - a - a 
b - a - a - a - b 
b - a - a - b - a 
b - a - a - b - b 
b - a - b - a - a 
b - a - b - a - b 
b - a - b - b - a 
b - a - b - b - b 
b - b - a - a - a 
b - b - a - a - b 
b - b - a - b - a 
b - b - a - b - b 
b - b - b - a - a 
b - b - b - a - b 
b - b - b - b - a 
b - b - b - b - b 
+0

Вы сэр волшебник! Спасибо огромное! – ianw

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