znalazłem na stronie:
http://php.net/manual/en/function.shuffle.php w komentarzach kod
<?php /* Use: $arr = power_perms($in); Example: $in = array("A","B","C"); $power_perms = power_perms($in); Returns: Array ( [0] => Array ( [0] => A [1] => B [2] => C ) [1] => Array ( [0] => A [1] => C [2] => B ) [2] => Array ( [0] => B [1] => A [2] => C ) [3] => Array ( [0] => B [1] => C [2] => A ) [4] => Array ( [0] => C [1] => A [2] => B ) [5] => Array ( [0] => C [1] => B [2] => A ) [6] => Array ( [0] => A [1] => B ) [7] => Array ( [0] => B [1] => A ) [8] => Array ( [0] => B [1] => C ) [9] => Array ( [0] => C [1] => B ) [10] => Array ( [0] => A [1] => C ) [11] => Array ( [0] => C [1] => A ) [12] => Array ( [0] => A ) [13] => Array ( [0] => B ) [14] => Array ( [0] => C ) ) */ function power_perms($arr) { $power_set = power_set($arr); foreach($power_set as $set) { $perms = perms($set); } return $result; } function power_set($in,$minLength = 1) { $members = pow(2,$count); for ($i = 0; $i < $members; $i++) { for ($j = 0; $j < $count; $j++) { if ($b{$j} == '1') $out[] = $in[$j]; } $return[] = $out; } } //usort($return,"cmp"); //can sort here by length return $return; } function factorial($int){ if($int < 2) { return 1; } for($f = 2; $int-1 > 1; $f *= $int--); return $f; } function perm($arr, $nth = null) { if ($nth === null) { return perms($arr); } while ($length--) { $f = factorial($length); $result[] = $arr[$p]; array_delete_by_key($arr, $p); $nth -= $p * $f; } return $result; } function perms($arr) { $p[] = perm($arr, $i); } return $p; } function array_delete_by_key(&$array, $delete_key, $use_old_keys = FALSE) { if(!$use_old_keys) { } return TRUE; } ?>
lecz otrzymany wynik algorytmu nie zgadza się z przykładem podanym przez autora:
pod odkomentowaniu linii: usort($return,"cmp"); i dodaniu funkcji cmp:
function cmp($a, $b) { if ($a == $b) { return 0; } return ($a > $b) ? -1 : 1; }
wyniki nie są podane w identycznej kolejności tylko:
( ( [0] => A [1] => B [2] => C ) ( [0] => A [1] => C [2] => B ) ( [0] => B [1] => A [2] => C ) ( [0] => B [1] => C [2] => A ) ( [0] => C [1] => A [2] => B ) ( [0] => C [1] => B [2] => A ) ( [0] => B [1] => C ) ( [0] => C [1] => B ) ( [0] => A [1] => C ) ( [0] => C [1] => A ) ( [0] => A [1] => B ) ( [0] => B [1] => A ) ( [0] => C ) ( [0] => B ) ( [0] => A ) )
macie może pomysł dlaczego?