2013-05-13 13 views
8

Obecnie próbuję sortować tablicę wielowymiarową według jej wartości podrzędnych. Struktura tablicy brzmi:Błąd usortowania z liczbami dziesiętnymi

[0] => Array 
    (
     [id] => 87 
     [sold] => 50 
     [stock] => 991 
     [speed] => 1.5 
     [days_left] => 660.66666666667 
    ) 

[1] => Array 
    (
     [id] => 97 
     [sold] => 20 
     [stock] => 120 
     [speed] => 1.2 
     [days_left] => 100 
    ) 

[2] => Array 
    (
     [id] => 36 
     [sold] => 2 
     [stock] => 1020 
     [speed] => 1.02 
     [days_left] => 1000 
    ) 

Kod używam jest:

usort($data, function($a, $b) { return $a[$_GET['sortby']] - $b[$_GET['sortby']]; }); 

gdzie zmienna $ _GET [ 'sortby'] równa się klucz.

Do tej pory wszystko działało dobrze, wszystko poprawnie sortuje Z WYJĄTKIEM prędkości! Najpierw myślałem, że to ma coś wspólnego z liczbami po przecinku, ale DAYS_LEFT obejmują również miejsca po przecinku i są klasyfikowane poprawnie ..:/

Prawidłowe wyjście (DAYS_LEFT):

[0] => Array 
    (
     [id] => 97 
     [sold] => 20 
     [stock] => 120 
     [speed] => 1.2 
     [days_left] => 100 
    ) 

[1] => Array 
    (
     [id] => 87 
     [sold] => 50 
     [stock] => 991 
     [speed] => 1.5 
     [days_left] => 660.66666666667 
    ) 

[2] => Array 
    (
     [id] => 36 
     [sold] => 2 
     [stock] => 1020 
     [speed] => 1.02 
     [days_left] => 1000 
    ) 

Zła moc (prędkość):

[0] => Array 
    (
     [id] => 97 
     [sold] => 20 
     [stock] => 120 
     [speed] => 1.2 
     [days_left] => 100 
    ) 

[1] => Array 
    (
     [id] => 87 
     [sold] => 50 
     [stock] => 991 
     [speed] => 1.5 
     [days_left] => 660.66666666667 
    ) 

[2] => Array 
    (
     [id] => 36 
     [sold] => 2 
     [stock] => 1020 
     [speed] => 1.02 
     [days_left] => 1000 
    ) 

Mam nadzieję, że ktoś może mi pomóc!

+1

Sprawdź swoje wyjścia .. są one w 100% takie same w tej chwili .. – Svetoslav

+2

Tak, są, i to był problem! Nie powinny być ..;) – Yami

Odpowiedz

31

Zobacz dokumenty usort. Wynik Float zostanie przekonwertowany na liczbę całkowitą. Dla prawidłowej pracy użyć tego kodu:

usort(
    $data, 
    function($a, $b) { 
     $result = 0; 
     if ($a[$_GET['sortby']] > $b[$_GET['sortby']]) { 
      $result = 1; 
     } else if ($a[$_GET['sortby']] < $b[$_GET['sortby']]) { 
      $result = -1; 
     } 
     return $result; 
    } 
); 
+1

Z jakiegoś powodu powyższy kod nie był dla mnie prawidłowy. Kiedy użyłem kodu w tej odpowiedzi, zrobił to. Mam nadzieję, że pomoże komuś! http://stackoverflow.com/questions/15941137/sort-multi-dimensional-array-by-decimal-values –

0

The PHP doc has a comment that has the solution to this problem. A big thanks to that guy.

Tutaj jest funkcją sortowania wielowymiarowych tablic z numerami dziesiętnych:

function usortWithFloatVals() { 
    $arguments = func_get_args(); 
    $array = $arguments[0]; 
    $code = ''; 
    for ($c = 1; $c < count($arguments); $c += 2) { 
     if (in_array($arguments[$c + 1], array("ASC", "DESC"))) { 
      $code .= 'if ($a["'.$arguments[$c].'"] != $b["'.$arguments[$c].'"]) {'; 
      if ($arguments[$c + 1] == "ASC") { 
       $code .= 'return ($a["'.$arguments[$c].'"] < $b["'.$arguments[$c].'"] ? -1 : 1); }'; 
      } 
      else { 
       $code .= 'return ($a["'.$arguments[$c].'"] < $b["'.$arguments[$c].'"] ? 1 : -1); }'; 
      } 
     } 
    } 
    $code .= 'return 0;'; 
    $compare = create_function('$a,$b', $code); 
    usort($array, $compare); 
    return $array; 
} 

używać go tak samo jak sposób korzystania usort():

usortWithFloatVals($data, function($a, $b) { 
    return ($a[$_GET['sortby']] - $b[$_GET['sortby']]) ? 1 : -1; 
}); 
Powiązane problemy