Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wariancje z powtórzeniami
Forum PHP.pl > Forum > PHP
markonix
  1. $count = 3; // jak to zaimplementować i gdzie, for?
  2. $elements = array('1', '2', '3', '4', '5');
  3. $array = array();
  4.  
  5. foreach ($elements as $v) {
  6. foreach ($elements as $vv) {
  7. foreach ($elements as $vvv) {
  8.  
  9. $array[] = $v .' - '. $vv .' - '. $vvv;
  10.  
  11. }
  12. }
  13. }
  14.  
  15. echo '<pre>'; print_r($array);


Kod
Array
(
    [0] => 1 - 1 - 1
    [1] => 1 - 1 - 2
    [2] => 1 - 1 - 3
    [3] => 1 - 1 - 4
    [4] => 1 - 1 - 5
    [5] => 1 - 2 - 1
    [6] => 1 - 2 - 2
    [7] => 1 - 2 - 3
    [8] => 1 - 2 - 4
    [9] => 1 - 2 - 5
    [10] => 1 - 3 - 1
    [11] => 1 - 3 - 2
    [12] => 1 - 3 - 3
    [13] => 1 - 3 - 4
    [14] => 1 - 3 - 5
    [15] => 1 - 4 - 1
    [16] => 1 - 4 - 2
    [17] => 1 - 4 - 3
    [18] => 1 - 4 - 4
    [19] => 1 - 4 - 5
    [20] => 1 - 5 - 1
    [21] => 1 - 5 - 2
    [22] => 1 - 5 - 3
    [23] => 1 - 5 - 4
    [24] => 1 - 5 - 5
    [25] => 2 - 1 - 1
    [26] => 2 - 1 - 2
    [27] => 2 - 1 - 3
    [28] => 2 - 1 - 4
    [29] => 2 - 1 - 5
itd.


Wynik to wszystkie możliwe wariancje z powtórzeniami, 3 elementowe.
Liczba możliwych wartości działa w porządku ale nie potrafię zrobić uniwersalnej pętli dla dowolnej liczby elementów (teraz 3).
Prosi się o rekurencje ale będzie dużo tego więc wole jej uniknąć.
Próbuje z for ale nic nie wychodzi.
radziopoke
jak nie chcesz rekurencji to spróbuj tak:
  1. <?php
  2. $count = 3;
  3. $elements = array('1', '2', '3', '4', '5');
  4. $array = array();
  5.  
  6. $countel = count($elements);
  7. $sum = pow($countel, $count);
  8.  
  9. $value = Array();
  10. $val = '';
  11. for($i=0; $i<$count; $i++)
  12. {
  13. $value[$i] = 0;
  14. if($i==0){$val .= $elements[$value[$i]];}else{$val .= ' - '.$elements[$value[$i]];}
  15. }
  16. $array[] = $val;
  17. for($i=1; $i<$sum; $i++)
  18. {
  19. $changeel = $count-1;
  20. $value[$changeel]++;
  21. while($value[$changeel]>=$countel)
  22. {
  23. $value[$changeel] = 0;
  24. $changeel--;
  25. $value[$changeel]++;
  26. }
  27. $val = '';
  28. for($j=0; $j<$count; $j++)
  29. {
  30. if($j==0){$val .= $elements[$value[$j]];}else{$val .= ' - '.$elements[$value[$j]];}
  31. }
  32. $array[] = $val;
  33. }
  34. echo '<pre>'; print_r($array);
  35. ?>

troszkę twój skrypt przerobiłem smile.gif
szybki opis:
wyliczamy ilość wszystkich możliwych kombinacji następnie za pomocą pętli for zmieniamy ostatnią wartość na następną. Gdy taka wartość jest już za wysoka zmieniamy na nowo na zero lecz wcześniejsza wartość podnosimy itd.
Od razu wolę uprzedzić, że elementy tablicy $elements musza mieć klucze ustawione w kolejności od 0.
Choć i tak uważam lepsze rozwiązanie przez rekurencję.
markonix
Haha, troszkę biggrin.gif
chyba prościej by było eval'em biggrin.gif

Nie no rekurencji nie chce bo pamięć się zapcha - kombinacji będzie kilkaset minimum, z tego co wiem w PHP limit to 100-200 odwołań.
Edit: przynajmniej na takiej informacje trafiłem bo jak testuje to nic się nie dzieje przy tysiącach rekurencjach..
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.