2013-05-13 12 views
8

Ich versuche derzeit, ein mehrdimensionales Array durch seine Unterwerte zu sortieren. Die Struktur des Arrays ist:Usort Problem mit Dezimalzahlen

[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 
    ) 

Der Code Ich verwende ist:

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

, wo die $ _GET [ 'sortby'] Variable den Schlüssel entspricht.

So weit so gut, alles funktioniert, es sortiert alle Werte richtig AUSSER die Geschwindigkeit! Zuerst dachte ich, es etwas mit den Dezimalzahlen zu tun hat, aber die DAYS_LEFT auch Dezimalstellen und richtig sortiert ..:/

korrekte Ausgabe (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 
    ) 

Falsche Ausgabe (Geschwindigkeit):

[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 
    ) 

Hoffe jemand kann mir helfen!

+1

Überprüfen Sie Ihre Ausgänge .. sie sind 100% im Moment gleich .. – Svetoslav

+2

Ja, das sind sie, und das war das Problem! Sie sollten nicht ..;) – Yami

Antwort

31

Siehe Gebrauchsanweisung. Das Float-Ergebnis wird in Integer umgewandelt. Für die korrekte Arbeit verwenden Sie diesen Code:

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

Aus irgendeinem Grund sortierte der obige Code für mich nicht richtig. Als ich den Code in dieser Antwort verwendete, tat es das. hoffentlich hilft jemand! 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.

Hier ist eine Funktion, mehrdimensionale Arrays mit Dezimalzahlen zu sortieren:

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; 
} 

Verwenden Sie es wie, wie Sie verwenden usort():

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