Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wygenerowanie 5 tablic z losową kolejnością elementów bez potwarzania się pozycji
Forum PHP.pl > Forum > PHP
eustach
Jest to mój pierwszy post tutaj więc witam wszystkich smile.gif

Mam do rozwiązania następujący problem. Potrzebuję utworzyć 5 tablic które zawierały by nazwy plików. Problem jest następujący:
- kolejność w tablicach musi być różna
- nie może dojść do sytuacji w której pod tym samym indeksem w różnych tablicach jest ta sama wartość, tzn. jeżeli tablica[1] zawiera 'plik1' to żadna z pozostałych tablic pod indeksem 1 nie może zawierać 'plik1', ale oczywiście 'plik1' może (a nawet musi) być w innym miejscu. Niewiem jak to jaśniej opisac wink.gif

Rozwiązanie które zastosowałem na chwilę obecną:

  1. $thumbs = $gallery ->get_thumbs_list();
  2. $random_1 = $random_2 = $random_3 = $random_4 = $random_5 = $thumbs;
  3. if ($thumbs_count >= 5) {
  4. $repeat = true;
  5. while ($repeat) {
  6. shuffle($random_1);
  7. shuffle($random_2);
  8. shuffle($random_3);
  9. shuffle($random_4);
  10. shuffle($random_5);
  11. $row_is_ok=true;
  12. for ($i=0; $i < $thumbs_count; $i++) {
  13. if ( ($random_1[$i] == $random_2[$i]) ||
  14. ($random_1[$i] == $random_3[$i]) ||
  15. ($random_1[$i] == $random_4[$i]) ||
  16. ($random_1[$i] == $random_5[$i]) ||
  17. ($random_2[$i] == $random_3[$i]) ||
  18. ($random_2[$i] == $random_4[$i]) ||
  19. ($random_2[$i] == $random_5[$i]) ||
  20. ($random_3[$i] == $random_4[$i]) ||
  21. ($random_3[$i] == $random_5[$i]) ||
  22. ($random_4[$i] == $random_5[$i]))
  23. $row_is_ok=false;
  24. }
  25. if ($row_is_ok) $repeat=false; else $repeat=true;
  26. }


Może da się prościej/lepiej? I nie chodzi mi tu o zrobienie tego bardziej uniwersalnie, tzn dla różnej ilości tablic. Ma być konkretnie dla 5 smile.gif
longinus_torwaldzki
a tak?

  1.  
  2. <?
  3. $array0=array(1,2,3,4,5);
  4. shuffle($array0);
  5. for ($i=1;$i<5;$i++){
  6. $i_=$i-1;
  7. ${'array'.$i}[0]=${'array'.$i_}[count($array0)-1];
  8. for ($j=0;$j<count($array0)-1;$j++){
  9. ${'array'.$i}[$j+1]=${'array'.$i_}[$j];
  10. }
  11.  
  12. }
  13. print_r ($array0);
  14. print_r ($array1);
  15. print_r ($array2);
  16. print_r ($array3);
  17. print_r ($array4);
  18. ?>
  19.  
  20.  


edit: oczywiście zakładamy, że losowo generuje się tablica0 a pozostałe to jej funkcje.
eustach
Pomysłowe i zdecydowanie szybciej działa ale za mało tu losowości. Widać po prostu że kolejne tablice nie są 'losowe', tylko są przesunięciem poprzedniej. Niemniej dzięki za odpowiedź smile.gif
longinus_torwaldzki
no nie da sie ukryc:| ewentualnie moglbys jeszcze przemieszac kolejnosc tablic...
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.