Witam,

znalazłem na stronie:
http://php.net/manual/en/function.shuffle.php w komentarzach kod

  1.  
  2. <?php
  3.  
  4. /*
  5.  Use: $arr = power_perms($in);
  6.  
  7.  Example:
  8.   $in = array("A","B","C");
  9.   $power_perms = power_perms($in);
  10.  
  11.  Returns:
  12.   Array
  13.   (
  14.   [0] => Array
  15.   (
  16.   [0] => A
  17.   [1] => B
  18.   [2] => C
  19.   )
  20.  
  21.   [1] => Array
  22.   (
  23.   [0] => A
  24.   [1] => C
  25.   [2] => B
  26.   )
  27.  
  28.   [2] => Array
  29.   (
  30.   [0] => B
  31.   [1] => A
  32.   [2] => C
  33.   )
  34.  
  35.   [3] => Array
  36.   (
  37.   [0] => B
  38.   [1] => C
  39.   [2] => A
  40.   )
  41.  
  42.   [4] => Array
  43.   (
  44.   [0] => C
  45.   [1] => A
  46.   [2] => B
  47.   )
  48.  
  49.   [5] => Array
  50.   (
  51.   [0] => C
  52.   [1] => B
  53.   [2] => A
  54.   )
  55.  
  56.   [6] => Array
  57.   (
  58.   [0] => A
  59.   [1] => B
  60.   )
  61.  
  62.   [7] => Array
  63.   (
  64.   [0] => B
  65.   [1] => A
  66.   )
  67.  
  68.   [8] => Array
  69.   (
  70.   [0] => B
  71.   [1] => C
  72.   )
  73.  
  74.   [9] => Array
  75.   (
  76.   [0] => C
  77.   [1] => B
  78.   )
  79.  
  80.   [10] => Array
  81.   (
  82.   [0] => A
  83.   [1] => C
  84.   )
  85.  
  86.   [11] => Array
  87.   (
  88.   [0] => C
  89.   [1] => A
  90.   )
  91.  
  92.   [12] => Array
  93.   (
  94.   [0] => A
  95.   )
  96.  
  97.   [13] => Array
  98.   (
  99.   [0] => B
  100.   )
  101.  
  102.   [14] => Array
  103.   (
  104.   [0] => C
  105.   )
  106.  
  107.   )
  108.  
  109. */
  110.  
  111. function power_perms($arr) {
  112.  
  113. $power_set = power_set($arr);
  114. $result = array();
  115. foreach($power_set as $set) {
  116. $perms = perms($set);
  117. $result = array_merge($result,$perms);
  118. }
  119. return $result;
  120. }
  121.  
  122. function power_set($in,$minLength = 1) {
  123.  
  124. $count = count($in);
  125. $members = pow(2,$count);
  126. $return = array();
  127. for ($i = 0; $i < $members; $i++) {
  128. $b = sprintf("%0".$count."b",$i);
  129. $out = array();
  130. for ($j = 0; $j < $count; $j++) {
  131. if ($b{$j} == '1') $out[] = $in[$j];
  132. }
  133. if (count($out) >= $minLength) {
  134. $return[] = $out;
  135. }
  136. }
  137.  
  138. //usort($return,"cmp"); //can sort here by length
  139. return $return;
  140. }
  141.  
  142. function factorial($int){
  143. if($int < 2) {
  144. return 1;
  145. }
  146.  
  147. for($f = 2; $int-1 > 1; $f *= $int--);
  148.  
  149. return $f;
  150. }
  151.  
  152. function perm($arr, $nth = null) {
  153.  
  154. if ($nth === null) {
  155. return perms($arr);
  156. }
  157.  
  158. $result = array();
  159. $length = count($arr);
  160.  
  161. while ($length--) {
  162. $f = factorial($length);
  163. $p = floor($nth / $f);
  164. $result[] = $arr[$p];
  165. array_delete_by_key($arr, $p);
  166. $nth -= $p * $f;
  167. }
  168.  
  169. $result = array_merge($result,$arr);
  170. return $result;
  171. }
  172.  
  173. function perms($arr) {
  174. $p = array();
  175. for ($i=0; $i < factorial(count($arr)); $i++) {
  176. $p[] = perm($arr, $i);
  177. }
  178. return $p;
  179. }
  180.  
  181. function array_delete_by_key(&$array, $delete_key, $use_old_keys = FALSE) {
  182.  
  183. unset($array[$delete_key]);
  184.  
  185. if(!$use_old_keys) {
  186. $array = array_values($array);
  187. }
  188.  
  189. return TRUE;
  190. }
  191. ?>
  192.  


lecz otrzymany wynik algorytmu nie zgadza się z przykładem podanym przez autora:

pod odkomentowaniu linii: usort($return,"cmp"); i dodaniu funkcji cmp:

  1. function cmp($a, $b)
  2. {
  3. if ($a == $b) {
  4. return 0;
  5. }
  6. return ($a > $b) ? -1 : 1;
  7. }


wyniki nie są podane w identycznej kolejności tylko:

  1. (
  2. [0] => Array
  3. (
  4. [0] => A
  5. [1] => B
  6. [2] => C
  7. )
  8.  
  9. [1] => Array
  10. (
  11. [0] => A
  12. [1] => C
  13. [2] => B
  14. )
  15.  
  16. [2] => Array
  17. (
  18. [0] => B
  19. [1] => A
  20. [2] => C
  21. )
  22.  
  23. [3] => Array
  24. (
  25. [0] => B
  26. [1] => C
  27. [2] => A
  28. )
  29.  
  30. [4] => Array
  31. (
  32. [0] => C
  33. [1] => A
  34. [2] => B
  35. )
  36.  
  37. [5] => Array
  38. (
  39. [0] => C
  40. [1] => B
  41. [2] => A
  42. )
  43.  
  44. [6] => Array
  45. (
  46. [0] => B
  47. [1] => C
  48. )
  49.  
  50. [7] => Array
  51. (
  52. [0] => C
  53. [1] => B
  54. )
  55.  
  56. [8] => Array
  57. (
  58. [0] => A
  59. [1] => C
  60. )
  61.  
  62. [9] => Array
  63. (
  64. [0] => C
  65. [1] => A
  66. )
  67.  
  68. [10] => Array
  69. (
  70. [0] => A
  71. [1] => B
  72. )
  73.  
  74. [11] => Array
  75. (
  76. [0] => B
  77. [1] => A
  78. )
  79.  
  80. [12] => Array
  81. (
  82. [0] => C
  83. )
  84.  
  85. [13] => Array
  86. (
  87. [0] => B
  88. )
  89.  
  90. [14] => Array
  91. (
  92. [0] => A
  93. )
  94. )


macie może pomysł dlaczego?

smile.gif