2017-11-21 1 views
0

ich folgendes Array sortieren möchten:Sortieren Monat-Jahr mehrdimensionales Array in PHP uksort

Array(
    [05/2017] => Array (
     [city] => 'ABC' 
     [memebers] => '50' 
    ) 
    [03/2017] => Array (
     [city] => 'ABC' 
     [members] => '25' 
    ) 
    [10/2016] => Array (
     [city] => 'ABC' 
     [members] => '20' 
    ) 
    [11/2017] => Array (
     [city] => 'ABC' 
     [members] => '65' 
    ) 
) 

Das erwartete Ergebnis:

Array(
    [10/2016] => Array (
     [city] => 'ABC' 
     [members] => '20' 
    ) 
    [03/2017] => Array (
     [city] => 'ABC' 
     [members] => '25' 
    ) 
    [05/2017] => Array (
     [city] => 'ABC' 
     [members] => '50' 
    ) 
    [11/2017] => Array (
     [city] => 'ABC' 
     [members] => '65' 
    ) 
) 

Ich uksort benutze es zu sortieren, aber ich erraten uksort nicht mit mehrdimensionalen Array funktioniert:

uksort($data, function($a1, $a2) { 
    $time1 = strtotime($a1); 
    $time2 = strtotime($a2); 

    return $time1 - $time2; 
}); 

Bitte vorschlagen Wie funktioniert es mit uksort oder einer anderen Möglichkeit?

+0

strtotime() gibt false zurück, weil es dieses Format nicht analysieren kann .... Verwenden Sie stattdessen DateTime :: createFromFormat() –

+0

Es wäre großartig, wenn Sie stattdessen nur dieses Array mit YM anstelle von MY-Schlüsseln erstellen würden. Dann könnten Sie einfach 'ksort' verwenden. –

Antwort

1

Dies sollte funktioniert:

$data = 
    array(
     '05/2017' => array (
      'city' => 'ABC', 
      'memebers' => '50' 
     ), 
     '03/2017' => array (
      'city' => 'ABC', 
      'members' => '25' 
     ), 
     '10/2016' => array (
      'city' => 'ABC', 
      'members' => '20' 
     ), 
     '11/2017' => array (
      'city' => 'ABC', 
      'members' => '65' 
     ), 
    ); 

uksort($data, function($a1, $a2) { 
    return DateTime::createFromFormat('m/Y|', $a1) <=> DateTime::createFromFormat('m/Y|', $a2); 
}); 

var_dump($data); 

Sie müssen Datetime verwenden, da Ihre Daten werden nicht gut formatiert, dann vergleichen nur die Zeitstempel. Wie von Mark, verwenden Sie "m" für Monate, und Sie können "< =>" operator (seit PHP 7)

+0

Ich schlage vor, dass es "m/Y" (für Monat/Jahr) statt "d/Y" sein sollte; und Sie möchten wahrscheinlich auch 'm/Y |' verwenden, um es zum ersten des Monats zu zwingen und Probleme wie 31. Februar am Ende des Monats zu vermeiden –

+0

Und Sie können einen einfachen Vergleich von DateTime-Objekten, sogar die ' <=> 'Operator –

+0

Sie haben Recht, korrigierte ich meine Antwort. Vielen Dank ! –

Verwandte Themen