Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wariancje z powtórzeniami
markonix
post
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


  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.

Ten post edytował markonix 20.08.2013, 00:30:47
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
radziopoke
post
Post #2





Grupa: Zarejestrowani
Postów: 125
Pomógł: 14
Dołączył: 2.06.2010

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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ę.
Go to the top of the page
+Quote Post
markonix
post
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Haha, troszkę (IMG:style_emoticons/default/biggrin.gif)
chyba prościej by było eval'em (IMG:style_emoticons/default/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..

Ten post edytował markonix 20.08.2013, 12:21:27
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 10:34