2016-06-29 8 views
1

Ich habe diese array: -Art mehrdimensionales Array nach Datum

array (size=8) 
    0 => 
    array (size=2) 
     'date' => string '17/05/2016 00:00:00' (length=19) 
     'reason' => string 'DNA' (length=3) 
    1 => 
    array (size=2) 
     'date' => string '10/05/2016 00:00:00' (length=19) 
     'reason' => string 'UTA' (length=3) 
    2 => 
    array (size=2) 
     'date' => string '03/05/2016 00:00:00' (length=19) 
     'reason' => string 'DNA' (length=3) 
    3 => 
    array (size=2) 
     'date' => string '26/04/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    4 => 
    array (size=2) 
     'date' => string '31/05/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    5 => 
    array (size=2) 
     'date' => string '24/05/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    6 => 
    array (size=2) 
     'date' => string '07/06/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    7 => 
    array (size=2) 
     'date' => string '14/06/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 

ich es von ‚date‘ sortieren wollen

Ich habe versucht, die beiden folgenden Methoden, aber das Ergebnis (unten) ist nicht richtig sortiert.

usort($course, function($a, $b) { 
    return $a['date'] - $b['date']; 
}); 

_______________________________ 
function date_compare($a, $b) 
{ 
    $t1 = strtotime($a['date']); 
    $t2 = strtotime($b['date']); 
    return $t1 - $t2; 
} 
usort($course, 'date_compare'); 

Dies ist die "sortiert" Array

array (size=8) 
    0 => 
    array (size=2) 
     'date' => string '24/05/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    1 => 
    array (size=2) 
     'date' => string '14/06/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    2 => 
    array (size=2) 
     'date' => string '31/05/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    3 => 
    array (size=2) 
     'date' => string '26/04/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    4 => 
    array (size=2) 
     'date' => string '17/05/2016 00:00:00' (length=19) 
     'reason' => string 'DNA' (length=3) 
    5 => 
    array (size=2) 
     'date' => string '03/05/2016 00:00:00' (length=19) 
     'reason' => string 'DNA' (length=3) 
    6 => 
    array (size=2) 
     'date' => string '07/06/2016 00:00:00' (length=19) 
     'reason' => string 'true' (length=4) 
    7 => 
    array (size=2) 
     'date' => string '10/05/2016 00:00:00' (length=19) 
     'reason' => string 'UTA' (length=3) 
+0

Kommt die Daten aus der Datenbank? Wenn ja, warum nicht zuerst über mysql sortieren? –

+0

Zuerst 'usort()' wird nicht funktionieren, da Sie Zeichenfolgen, nicht Daten vergleichen. Du meinst also die Funktion "date_compare" funktioniert nicht? Verwenden Sie PHPFiddle, um ein Beispiel zu geben: http://sandbox.onlinephpfunctions.com/ – Justinas

+2

String '24/05/2016 00: 00: 00' kann nicht in datetime konvertiert werden, da strtotime den Monat zuerst erwartet. Benutze create from format - http://php.net/manual/en/datetime.createfromformat.php – splash58

Antwort

2

Sie müssen die datetime strings in Ihrem $course Array ändern, um sie in der gewünschten Weise vergleichbar zu machen.

Eine (flexible) Möglichkeit besteht darin, DateTime() Objekte aus Ihren datetime strings zu erstellen und diese zu vergleichen.

Eine kurze Anmerkung zu den Datumsangaben: Das Standard-US-Format m/d/Y verwendet Schrägstriche, und das europäische Standardformat d-m-Y verwendet Bindestriche. Ihre Datetime-Strings sind eine Mischung aus beidem, wobei Schrägstriche im US-Stil mit der europäischen Tag/Monat/Jahr-Reihenfolge verwendet werden.

Daher müssen Sie einen zusätzlichen Schritt ausführen, um jede Datetime-Zeichenfolge vor dem Vergleich in ein gültiges Objekt DateTime() zu analysieren.

Statische Methode DateTime::createFromFormat() kann in dieser Hinsicht helfen. Zum Beispiel bei einem gegebenen Array namens $course:

$course = [ 
    [ 
     'date' => '17/05/2016 00:00:00', 
     'reason' => 'DNA', 
    ], 
    [ 
     'date' => '10/05/2016 00:00:00', 
     'reason' => 'UTA', 
    ], 
    [ 
     'date' => '03/05/2016 00:00:00', 
     'reason' => 'DNA', 
    ], 
    [ 
     'date' => '26/04/2016 00:00:00', 
     'reason' => 'true', 
    ], 
    [ 
     'date' => '31/05/2016 00:00:00', 
     'reason' => 'true', 
    ], 
    [ 
     'date' => '24/05/2016 00:00:00', 
     'reason' => 'true', 
    ], 
    [ 
     'date' => '07/06/2016 00:00:00', 
     'reason' => 'true', 
    ], 
    [ 
     'date' => '14/06/2016 00:00:00', 
     'reason' => 'true', 
    ], 
]; 

Sie können dann einen Rückruf mit usort() anwenden, die den date Wert jedes Vergleichsobjekt in eine gültige DateTime() Objekte konvertiert, bevor sie zu vergleichen:

usort($course, function ($a, $b) { 
    $dateA = DateTime::createFromFormat('d/m/Y H:i:s', $a['date']); 
    $dateB = DateTime::createFromFormat('d/m/Y H:i:s', $b['date']); 
    // ascending ordering, use `<=` for descending 
    return $dateA >= $dateB; 
}); 

print_r($course); 

Dies ergibt:

Array 
(
    [0] => Array 
     (
      [date] => 26/04/2016 00:00:00 
      [reason] => true 
     ) 

    [1] => Array 
     (
      [date] => 03/05/2016 00:00:00 
      [reason] => DNA 
     ) 

    [2] => Array 
     (
      [date] => 10/05/2016 00:00:00 
      [reason] => UTA 
     ) 

    [3] => Array 
     (
      [date] => 17/05/2016 00:00:00 
      [reason] => DNA 
     ) 

    [4] => Array 
     (
      [date] => 24/05/2016 00:00:00 
      [reason] => true 
     ) 

    [5] => Array 
     (
      [date] => 31/05/2016 00:00:00 
      [reason] => true 
     ) 

    [6] => Array 
     (
      [date] => 07/06/2016 00:00:00 
      [reason] => true 
     ) 

    [7] => Array 
     (
      [date] => 14/06/2016 00:00:00 
      [reason] => true 
     ) 

) 

Wenn Ihr Course-Array sehr groß ist, kann es bei der Erstellung von DateTime Objekten wie im obigen Beispiel zu einem Overhead kommen. YMMV. In diesem Fall würde ich zuerst eine Zuordnung über das Array in Betracht ziehen und für jeden Eintrag DateTime Objekte erstellen und dann usort() anwenden.

Beachten Sie, dass mit einem Standardformat Datetime-Zeichenfolge, wie europäischen d-m/Y H:i:s, US m/d/Y H:i:s oder IS08601 Y-m-d H:i:s, können Sie einfach die Datetime-Zeichenfolge als ersten Wert in den DateTime Konstruktor stattdessen übergeben; e.g:

$dt = new DateTime($someStandardFormatDateTimeString); 

Entschuldigungen über die irreguläre enge Abstimmung früher. Ich habe das jetzt entfernt.

Hoffe das hilft :)