Комбинации массивов PHP

У меня есть массив из 7 чисел (1,2,3,4,5,6,7), и я хочу сделать пары из 5 чисел вроде (1,2,3,4,5), (1,2,3 , 4,6,), (1,2,3,4,7). (1,2,3,4,5) равна (4,5,3,1,2)

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

Я хочу, чтобы все комбинации из 7 заданных чисел (они взяты из массива) помещены в 5 слотов, без учета порядка

Related of "Комбинации массивов PHP"

Вы можете использовать решение, найденное здесь http://stereofrog.com/blok/on/070910 .

Покажите, что ссылка идет вниз, вот код ….

class Combinations implements Iterator { protected $c = null; protected $s = null; protected $n = 0; protected $k = 0; protected $pos = 0; function __construct($s, $k) { if(is_array($s)) { $this->s = array_values($s); $this->n = count($this->s); } else { $this->s = (string) $s; $this->n = strlen($this->s); } $this->k = $k; $this->rewind(); } function key() { return $this->pos; } function current() { $r = array(); for($i = 0; $i < $this->k; $i++) $r[] = $this->s[$this->c[$i]]; return is_array($this->s) ? $r : implode('', $r); } function next() { if($this->_next()) $this->pos++; else $this->pos = -1; } function rewind() { $this->c = range(0, $this->k); $this->pos = 0; } function valid() { return $this->pos >= 0; } protected function _next() { $i = $this->k - 1; while ($i >= 0 && $this->c[$i] == $this->n - $this->k + $i) $i--; if($i < 0) return false; $this->c[$i]++; while($i++ < $this->k - 1) $this->c[$i] = $this->c[$i - 1] + 1; return true; } } foreach(new Combinations("1234567", 5) as $substring) echo $substring, ' '; 

12345 12346 12347 12356 12357 12367 12456 12457 12467 12567 13456 13457 13467 13567 14567 23456 23457 23467 23567 24567 34567

 <?php echo "<pre>"; $test = array("test_1","test_2","test_3"); // Get Combination $return = uniqueCombination($test); //Sort sort($return); //Pretty Print print_r(array_map(function($v){ return implode(",", $v); }, $return)); function uniqueCombination($in, $minLength = 1, $max = 2000) { $count = count($in); $members = pow(2, $count); $return = array(); for($i = 0; $i < $members; $i ++) { $b = sprintf("%0" . $count . "b", $i); $out = array(); for($j = 0; $j < $count; $j ++) { $b{$j} == '1' and $out[] = $in[$j]; } count($out) >= $minLength && count($out) <= $max and $return[] = $out; } return $return; } ?> 

вывод

 Array ( [0] => test_1 [1] => test_2 [2] => test_3 [3] => test_1,test_2 [4] => test_1,test_3 [5] => test_2,test_3 [6] => test_1,test_2,test_3 ) 

Math_Combinatorics в репозитории PEAR делает именно то, что вы хотите:

Пакет, который возвращает все комбинации и перестановки, без повторения, заданного размера и подмножества. Ассоциативные массивы сохраняются.

 require_once 'Math/Combinatorics.php'; $combinatorics = new Math_Combinatorics; $input = array(1, 2, 3, 4, 5, 6, 7); $output = $combinatorics->combinations($input, 5); // 5 is the subset size // 1,2,3,4,5 // 1,2,3,4,6 // 1,2,3,4,7 // 1,2,3,5,6 // 1,2,3,5,7 // 1,2,3,6,7 // 1,2,4,5,6 // 1,2,4,5,7 // 1,2,4,6,7 // 1,2,5,6,7 // 1,3,4,5,6 // 1,3,4,5,7 // 1,3,4,6,7 // 1,3,5,6,7 // 1,4,5,6,7 // 2,3,4,5,6 // 2,3,4,5,7 // 2,3,4,6,7 // 2,3,5,6,7 // 2,4,5,6,7 // 3,4,5,6,7 

Здесь я привел пример, как это сделать https://stackoverflow.com/a/8880362/1010916

вы должны просто выполнить следующую функцию с помощью указанной выше ссылки:

 getCombinations(array(1,2,3,4,5,6,7),5) 

Попробуйте одну из описанных здесь реализаций

Алгоритм возврата всех комбинаций k элементов из n