Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] generowanie kombinacji
Forum PHP.pl > Forum > Przedszkole
1q2w3e4r
Witam

Jak wygenerować wszystkie możliwe kombinacje o zadnej długości z podanej w tablicy znaków?

  1. function generujKombinacje($tablica, $dlugosc)
  2. {
  3.  
  4. echo $ciagi."\r\n";
  5. }
  6.  
  7. $tablica = array('6', '9', '3', 'k', 'd', 'e', 'w', 'b');
  8. generujKombinacje($tablica, 3);
djgarsi
Chwila w Google.

  1. function pc_permute($items, $perms = array()) {
  2. if (empty($items)) {
  3. echo join(' ', $perms) . "<br />";
  4. } else {
  5. for ($i = count($items) - 1; $i >= 0; --$i) {
  6. $newitems = $items;
  7. $newperms = $perms;
  8. list($foo) = array_splice($newitems, $i, 1);
  9. array_unshift($newperms, $foo);
  10. pc_permute($newitems, $newperms);
  11. }
  12. }
  13. }
  14.  
  15. $arr = array('6', '9', '3', 'k', 'd', 'e', 'w', 'b');
  16.  
  17. pc_permute($arr);
1q2w3e4r
Dzięki za odpowiedź. Już widziałem ten skrypt ale on generuje wszystkie kombinacje o długości ilości kluczy w tablicy i nie da się tego limitować. Ja potrzebuję tak jak pisałem (i podałem w przykładzie) wygenerować wszystkie kombinacje O ZADANEJ DŁUGOŚCI. Czyli z podanej tablicy o długości kombinacji 3, będzie to przykładowo:
669
699
639
6k9
6d9
6e9
6w9
6b9
...itd

Jak podam 2 to będzie przykładowo:
66
69
63
6k
6d
6e
6w
6b
..itd

golabow
Napisałem przykładowe rozwiązanie, zobacz czy Ci odpowiada ( przetestuj ) :

  1. <?php
  2.  
  3. function silnia( $n ) { return !$n ? 1 : $n * silnia( $n - 1 ); }
  4.  
  5. function czyJest( $kombinacje, $tmp )
  6. {
  7. foreach( $kombinacje as $element )
  8. {
  9. if ( $element == $tmp ) return true;
  10. }
  11.  
  12. return false;
  13. }
  14.  
  15. function generujKombinacje($tablica, $dlugosc)
  16. {
  17. $arr = array();
  18. for ( $i = 0; $i < $dlugosc; $i++ ) $arr[$i] = 0;
  19. $len = count( $tablica );
  20. // ilosc kombinacji wzór z Wikipedii :)
  21. $iloscKombinacji = silnia( $dlugosc + $len - 1 ) / ( silnia( $dlugosc ) * silnia( $len - 1 ) );
  22.  
  23. $kombinacje = array();
  24. while ( $iloscKombinacji )
  25. {
  26. $tmp = '';
  27. foreach( $arr as $j ) $tmp .= $tablica[ $j ];
  28. $tmp = str_split( $tmp );
  29. sort( $tmp );
  30. $tmp = implode( '', $tmp );
  31.  
  32. if ( !czyJest( $kombinacje, $tmp ) )
  33. {
  34. $kombinacje[] = $tmp;
  35. $iloscKombinacji--;
  36. }
  37.  
  38. for ( $k = $dlugosc - 1; $k >= 0; $k-- )
  39. {
  40. $arr[$k]++;
  41. if ( $arr[$k] == $len )
  42. {
  43. $arr[$k] %= $len;
  44. }
  45. else break;
  46. }
  47. }
  48.  
  49. return $kombinacje;
  50. }
  51.  
  52. $wynik = generujKombinacje( array('6', '9', '3', 'k', 'd', 'e', 'w', 'b'), 2 );
  53.  
  54. foreach( $wynik as $element ) echo $element.'<br />';
  55.  
  56. ?>


EDIT: porawiłem, teraz powinny być dobre wyniki. Warto wspomnieć że nie jest to optymalne rozwiązanie, ale sam jestem początkujący.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.