2009-02-28 12 views
17

Ich habe ein Array in diesem Format sortieren:Wie ein Datum Array in PHP

Array 
(
    [0] => Array 
     (
      [28th February, 2009] => 'bla' 
     ) 

    [1] => Array 
     (
      [19th March, 2009] => 'bla' 
     ) 

    [2] => Array 
     (
      [5th April, 2009] => 'bla' 
     ) 

    [3] => Array 
     (
      [19th April, 2009] => 'bla' 
     ) 

    [4] => Array 
     (
      [2nd May, 2009] => 'bla' 
     ) 

) 

Ich möchte, dass sie in aufsteigender Reihenfolge, in der auszusortieren (bezogen auf den Monat, Tag und Jahr) . Was ist der beste Weg, das zu tun?

Ursprünglich ist die E-Mails werden in dem MySQL-Datumsformat geholt, so dass du mir möglich, die Anordnung in diesem Zustand zu erhalten:

Array 
[ 
    ['2008-02-28']='some text', 
    ['2008-03-06']='some text' 
] 

Vielleicht, wenn sie in diesem Format seine, kann ich Schleife durch sie, entfernen alle '-' (Bindestrich) Marken, so dass sie als Integars verlassen werden, sortieren Sie sie mit array_sort() und durchlaufen Sie sie noch einmal, um sie zu sortieren? Würde es bevorzugen, wenn es einen anderen Weg gäbe, als würde ich 3 Schleifen mit diesem pro Benutzer machen.

Danke.

Edit: Ich könnte auch dies tun:

$array[$index]=array('human'=>'28 Feb, 2009', 
        'db'=>'20080228', 
        'description'=>'Some text here'); 

Aber diese verwenden, würde jede mögliche Weise dort sein, um die Anordnung auf dem ‚db‘ Elemente allein zu sortieren?

Edit 2: Aktualisierte Anfangs Var_dump

+2

Können Sie bitte var_dump() für Ihre Daten verwenden, anstatt ein eigenes Format zu erstellen? Zumindest wenn Ihr eigenes Format so zweideutig und irreführend ist wie das, was Sie hier gepostet haben. ;-) – Tomalak

Antwort

40

Verwenden Sie die ISO (yyyy-mm-dd) Format und nicht die „Englisch“ -Format und dann benutzen Sie einfach die ksort Funktion sie in der richtigen Reihenfolge zu erhalten.

gibt es keine Notwendigkeit, die Bindestriche zu entfernen, ksort wird einen alphanumerischen Vergleich zu dem String-Schlüssel tun, und das yyyy-mm-dd Format funktioniert sehr gut, wie die lexikalische Reihenfolge die gleiche wie die tatsächlichen Datum Ordnung ist.

EDIT Ich sehe, Sie haben jetzt Ihre Frage korrigiert, um zu zeigen, dass Sie tatsächlich ein Array von Arrays haben, und dass der Sortierschlüssel in den Sub-Arrays ist. In diesem Fall sollten Sie uksort verwenden, wie an anderer Stelle zu empfehlen, aber ich würde empfehlen, dass Sie mit Ihrem eigenen bearbeiten gehen und Art auf der Grundlage der DB formatiert Datum, anstatt durch den Menschen lesbaren Format Parsing:

function cmp($a, $b) 
{ 
    global $array; 
    return strcmp($array[$a]['db'], $array[$b]['db']); 
} 

uksort($array, 'cmp'); 
4
function cmp($a, $b) {  
    global $array;  
    return strcmp($array[$a]['db'], $array[$b]['db']); 
}  
uksort($array, 'cmp'); 

Ich denke, es ist besser usort() Funktion anstelle von uksort() zu verwenden, weil Sie manchmal globale Variablen überhaupt nicht verwenden können und sowieso globale Variablen verwenden, ist auch keine gute Praxis.

10

Eigentlich verwenden diese:

usort($array, "cmp"); 

function cmp($a, $b){ 
    return strcmp($b['db'], $a['db']); 
} 

:)

+0

Das hat bei mir funktioniert. Vielen Dank. –

2

Sie auch anonyme Funktion nutzen zu können.

// Sort in chronological order. 
usort($array, function($a, $b) { 
    return strcmp($a['db'], $b['db']); 
}); 
+1

Diese Antwort ist im Grunde die gleiche wie ältere Antworten – Machavity

+1

Es verwendet anonyme Funktion, wo die anderen nicht. –