Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Różne wyniki sortowania w zależności od wersji PHP
soltysadam
post 25.10.2023, 12:22:57
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.12.2020

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


Cześć mam problem lub zagwostke. Mam taki kod który ma mi tablice posortować rosnąco jednak najpierw liczby parzyste a potem nieparzyste. Korzystam z funkcji usort. I teraz tak jak odpalam ten kod w PHP w wersji 5.4 to sortuje w taki sposób jak opisałem. Jednak w wersjach od 7 w góre sortuje, już od najmniejszej do największej po kolei. Z tego co znalazłem w sieci to i w wersji 5 jak i 7 usort korzysta z QuickSorta wiec nie wiem co może być przyczyną.
PS. Napisałem sobie ten warunek również w inny sposób i już poprawnie mi sortuje, jednak nie mam pojęcia czemu pierwszy zachowuje się w ten sposób

1. Wersja 1
  1.  
  2. $tab1 = [5, 7, 3, 1, 8, 2, 0, 4, 9, 6];
  3. echo "Zawarość tablicy przed posortowaniem\n";
  4.  
  5. foreach ($tab1 as $val) {
  6. echo $val;
  7. }
  8. usort($tab1, function($e1, $e2)
  9. {
  10. if ($e1 % 2 == 0 && $e2 % 2 != 0) {
  11. return -1;
  12. } elseif ($e1 % 2 != 0 && $e2 == 0) {
  13. return 1;
  14. } else {
  15. return $e1 - $e2;
  16. }
  17. }
  18. );
  19.  
  20. echo "\nTablica po posortowaniu:\n";
  21. foreach ($tab1 as $val) {
  22. echo $val;
  23. }
  24.  


Wersja poprawnie działająca
  1.  
  2. $tab1 = [5, 7, 3, 1, 8, 2, 0, 4, 9, 6];
  3. usort($tab1, function($e1, $e2)
  4. {
  5. if ($e1 % 2 == $e2 % 2) {
  6. return $e1 - $e2;
  7. }
  8. if ($e1 % 2 == 0) {
  9. return -1;
  10. }
  11. return 1;
  12. }
  13. );
  14.  
  15. foreach ($tab1 as $val) {
  16. echo $val;
  17. }


Ten post edytował soltysadam 25.10.2023, 12:23:58
Go to the top of the page
+Quote Post
vokiel
post 25.10.2023, 13:05:42
Post #2





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Odnośnie zmian w sortowaniu:

https://bugs.php.net/bug.php?id=69158

W PHP od 7 przekazywane parametry są w innej kolejności niż w PHP 5 i poniżej. Także Twój kod powinien porównywać te parametry bez względu na ich kolejność.

Odnośnie Twojego pierwszego kodu to ma błąd - drugie porównanie porównuje $e2 do zera bez modulo

  1. <?php
  2.  
  3. $tab1 = [5, 7, 3, 1, 8, 2, 0, 4, 9, 6];
  4.  
  5. usort($tab1, function($e1, $e2)
  6. {
  7. echo $e1.' | '.$e2.PHP_EOL;
  8.  
  9. if ($e1 % 2 == 0 && $e2 % 2 != 0) {
  10. return -1;
  11. } elseif ($e1 % 2 != 0 && $e2 % 2 == 0) {
  12. return 1;
  13. } else {
  14. return $e2 - $e1;
  15. }
  16. }
  17. );
  18. print_r($tab1);


Kod
Output for 5.6.40 | released 2019-01-10 | took 18 ms, 16.62 MiB
    8 | 7
    6 | 8
    8 | 3
    9 | 8
    4 | 8
    8 | 1
    0 | 8
    8 | 5
    2 | 8
    6 | 2
    6 | 4
    0 | 6
    2 | 0
    4 | 2
    3 | 1
    3 | 5
    7 | 3
    9 | 3
    5 | 3
    9 | 5
    7 | 9
    5 | 7
    Array
    (
        [0] => 0
        [1] => 2
        [2] => 4
        [3] => 6
        [4] => 8
        [5] => 1
        [6] => 3
        [7] => 5
        [8] => 7
        [9] => 9
    )


Kod
Output for 7.4.33 | released 2022-11-03 | took 23 ms, 14.25 MiB
    5 | 7
    7 | 3
    5 | 3
    7 | 1
    5 | 1
    3 | 1
    7 | 8
    5 | 8
    3 | 8
    1 | 8
    7 | 2
    5 | 2
    3 | 2
    1 | 2
    8 | 2
    7 | 0
    3 | 0
    8 | 0
    0 | 2
    7 | 4
    3 | 4
    8 | 4
    0 | 4
    2 | 4
    7 | 9
    9 | 6
    5 | 6
    1 | 6
    4 | 6
    8 | 6
    Array
    (
        [0] => 0
        [1] => 2
        [2] => 4
        [3] => 6
        [4] => 8
        [5] => 1
        [6] => 3
        [7] => 5
        [8] => 7
        [9] => 9
    )


--------------------
Go to the top of the page
+Quote Post
soltysadam
post 26.10.2023, 10:13:52
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 4.12.2020

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


Dziękuje Ci bardzo, faktycznie przez 40 minut parzyłem w ten kod i nie widziałem tego błędu ohno-smiley.gif
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 Wersja Lo-Fi Aktualny czas: 28.04.2024 - 00:31