PHP中的组合,部署和排列

什么是最有效的方式来产生在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的解决scheme,它可以生成数组项目的组合。

它是有限的所有组合是全长,而不是重复任何项目。 但是我相信实施不会太难。

 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的原因,我相信有很好的理由这样做。