Каков наиболее эффективный способ создания всех комбинаций, расположений и перестановок массива в PHP?
Вот код, чтобы получить все перестановки:
http://www.php.net/manual/en/function.shuffle.php#90615
С кодом, чтобы получить набор мощности, перестановки – это максимальная длина, набор мощности должен быть всеми комбинациями. Я понятия не имею, что такое диспозиции, поэтому, если вы можете объяснить их, это поможет.
Вы можете использовать этот класс: http://pear.php.net/package/Math_Combinatorics
и используйте его так:
$combinatorics = new Math_Combinatorics; $words_arr = array( 'one' => 'a', 'two' => 'b', 'three' => 'c', 'four' => 'd', ); for ($i=count($words_arr)-1;$i>=1;$i--) { echo '<br><br>' . $i . ':<br>'; $combinations_arr = $combinatorics->combinations($words_arr, $i); foreach ($combinations_arr as $combinations_arr_item) { echo implode(', ', $combinations_arr_item) . '<br>'; } }
/* Combinations */ function nCr($n, $r) { if ($r > $n) { return NaN; } if (($n - $r) < $r) { return nCr($n, ($n - $r)); } $return = 1; for ($i = 0; $i < $r; $i++) { $return *= ($n - $i) / ($i +1); } return $return; } /* Permutations */ function nPr($n, $r) { if ($r > $n) { return NaN; } if ($r) { return $n * (nPr($n -1, $r -1)); } else { return 1; } }
Я хотел бы предложить свое решение CombinationsGenerator , которое генерирует комбинации элементов массива.
Он ограничен всеми комбинациями полной длины и не повторяет ни одного элемента. Но я считаю, что реализация не будет слишком сложной.
class CombinationsGenerator { public function generate(array $list): \Generator { if (count($list) > 2) { for ($i = 0; $i < count($list); $i++) { $listCopy = $list; $entry = array_splice($listCopy, $i, 1); foreach ($this->generate($listCopy) as $combination) { yield array_merge($entry, $combination); } } } elseif (count($list) > 0) { yield $list; if (count($list) > 1) { yield array_reverse($list); } } } } $generator = new \CombinationsGenerator(); foreach ($generator->generate(['A', 'B', 'C', 'D']) as $combination) { var_dump($combination); }
Он в стиле PHP7, он использует причину \Generator
, потому что я считаю, что есть веские причины для этого.