Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie wyników
Forum PHP.pl > Forum > PHP
soliniak
Może mi ktoś podpowiedzieć jak posortować wyniki od min do max?
Bo już wymiękam... próbuję użyć funkcji sort ale nic nie daje....
I czy zaznaczony fragment jest konieczny? Trzeba zadeklarować w ten sposób array czy starczy pętla for?

  1. <?php
  2. $k = 9;
  3. $n = 805;
  4.  
  5. function losuj($k, $n) {
  6.  
  7. // sprawdz poprawnosc danych wejsciowych
  8. if ($k > $n) {
  9. echo "Nieprawidłowe dane wejściowe";
  10. }
  11.  
  12. // wypełnianie tablicy liczbami 1,2...n
  13. $numbers = array($n); <<<<<<<<<<<< ------------------ ten fragment jest niepotrzebny??
  14. for ($i=0; $i<$n; $i++) {
  15. $numbers[$i] = $i + 1;
  16. }
  17.  
  18. // losowanie k liczb
  19. for ($i=0; $i<$k; $i++) {
  20.  
  21. // tworzenie losowego indeksu pomiędzy 0 i n - 1
  22. $r = floor(rand(0, $n));
  23. sort($numbers);
  24.  
  25. // wybieramy element z losowego miejsca
  26. echo $numbers[$r]." | ";
  27.  
  28. // przeniesienia ostatniego elementu do miejsca z którego wzięliśmy
  29. $numbers[$r] = $numbers[$n - 1];
  30.  
  31. //zmniejszamy n
  32. $n--;
  33. }
  34. }
  35.  
  36. losuj($k, $n);
  37.  
  38. ?>


Dziękuję za pomoc wink.gif
Nattfarinn
Niestety, z kawałka kodu który wkleiłeś ciężko wywnioskować co tak właściwie chcesz osiągnąć. Widzę też pewne naleciałości z innych języków.

Ale po kolei:
  1. if ($k > $n) {
  2. echo "Nieprawidłowe dane wejściowe";
  3. }

Słuszne założenie, ale zwykły if i echo nie powstrzymają wywoływania dalszej części skryptu mimo oblania warunku walidacji. Sugeruję jakiś wyjątek, return lub pospolity die/exit.

  1. $numbers = array($n);

Nie robi tego co wydaje Ci się, że robi. Właśnie utworzyłeś jednoelementową tablicę zawierającą element $n. W skrócie w PHP jest dynamiczna alokacja pamięci tablic, więc taka deklaracja nie jest kompletnie potrzebna.

  1. $numbers = array($n);
  2.  
  3. for ($i=0; $i<$n; $i++) {
  4. $numbers[$i] = $i + 1;
  5. }

To wszystko da się przede wszystkim zastąpić prostym:
  1. $numbers = range(1, $n);


  1. $r = floor(rand(0, $n));

Nie ma potrzeby zaokrąglania wartości zwracanej przez rand. PHP zwraca liczbę całkowitą z podanego przedziału (lub [0 .. getrandmax()] jeśli przedziału nie podasz).

  1. // losowanie k liczb
  2. for ($i=0; $i<$k; $i++) {
  3.  
  4. // tworzenie losowego indeksu pomiędzy 0 i n - 1
  5. $r = floor(rand(0, $n));
  6.  
  7. // wybieramy element z losowego miejsca
  8. echo $numbers[$r]." | ";
  9.  
  10. // przeniesienia ostatniego elementu do miejsca z którego wzięliśmy
  11. $numbers[$r] = $numbers[$n - 1];
  12.  
  13. //zmniejszamy n
  14. $n--;
  15. }

To również robienie na piechotę tego, co w PHP jest wbudowane. Wystarczy prosta funkcja:
  1. $random = array_rand($numbers, $k);


Nie jestem przekonany dlaczego chciałeś sortować dla każdego losowania tablicę $numbers, ale zakładam, że chodziło Ci o posortowanie liczb już wylosowanych. Sortowanie wykonujesz więc tylko raz, na końcu. W skrócie, całość da się zapisać:

  1. <?php
  2.  
  3. function losuj($k, $n)
  4. {
  5. if ($k > $n) {
  6. die("Nieprawidłowe dane wejściowe");
  7. }
  8.  
  9. $numbers = range(1, $n);
  10. $random = array_rand($numbers, $k);
  11. sort($random);
  12.  
  13. return $random;
  14. }
  15.  
  16.  
  17. $k = 9;
  18. $n = 805;
  19.  
  20. $wylosowane = losuj($k, $n);
  21.  
  22. print_r($wylosowane);
  23.  
  24. ?>
soliniak
Pięknie mi to napisałeś smile.gif.
To prawda, przykład był z JavaScript przerobiony na PHP (tak przynajmniej próbowałem) żeby zaoszczędzić sobie czasu.
Może gdybym robił od podstaw całość w PHP to nie byłoby to takie zagmatwane smile.gif
Dziękuję bardzo za pomoc smile.gif
Pyton_000
Jeśli portuje się coś z innego języka to czasami lepiej przepisać linijka po linijce a potem jeżeli to działa zrobić refaktoryzację upraszczając kod dzięki czemu jest bardziej czytelny.
Dlatego uważam że Twój sposób był dobry, ale potem powinieneś doprowadzić to do stanu czytelnego i dalej działać nawet jeśli ostatecznie wrócisz do stanu prawie pierwotnego.
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.