Kombinationen, Dispositionen und Permutationen in PHP

Was ist der effizienteste Weg, um alle Kombinationen, Dispositionen und Permutationen eines Arrays in PHP zu generieren?

Hier ist Code, um alle Permutationen zu erhalten:

http://www.php.net/manual/en/function.shuffle.php#90615

Mit dem Code, um die Potenz zu erhalten, sind Permutationen diejenigen mit maximaler Länge, die Potenzmenge sollte alle Kombinationen sein. Ich habe keine Ahnung, was Dispositionen sind, also wenn Sie sie erklären können, würde das helfen.

Sie können diese class verwenden: http://pear.php.net/package/Math_Combinatorics

und benutze es wie:

$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 '

' . $i . ':
'; $combinations_arr = $combinatorics->combinations($words_arr, $i); foreach ($combinations_arr as $combinations_arr_item) { echo implode(', ', $combinations_arr_item) . '
'; } }
 /* 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; } } 

Ich würde gerne meine Lösung eines CombinationsGenerators vorschlagen, der Kombinationen von Array-Elementen generiert.

Es ist auf alle Kombinationen beschränkt, die die volle Länge haben, und wiederholt keine Gegenstände. Aber ich glaube, die Umsetzung wäre nicht zu schwer.

 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); } 

Es ist im PHP7-Stil, es verwendet einen \Generator , weil ich glaube, dass es gute Gründe dafür gibt.