Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sortowanie wyników
soliniak
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 8.08.2009

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


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
Go to the top of the page
+Quote Post
Nattfarinn
post
Post #2





Grupa: Zarejestrowani
Postów: 136
Pomógł: 22
Dołączył: 19.09.2007
Skąd: Sosnowiec

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


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. ?>


Ten post edytował Nattfarinn 13.04.2015, 13:47:46


--------------------
Code should run as fast as necessary, but no faster; something important is always traded away to increase speed.
-- R. Pattis
Go to the top of the page
+Quote Post
soliniak
post
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 8.08.2009

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


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
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 20:16