web-dev-qa-db-fra.com

Comment trier un tableau de dates dans PHP

J'ai un tableau dans ce format:

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

) 

Je veux les trier dans l'ordre croissant des dates (en fonction du mois, du jour et de l'année). Quelle est la meilleure façon de procéder?

À l'origine, les e-mails sont récupérés au format de date MySQL, il est donc possible pour moi d'obtenir le tableau dans cet état:

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

Peut-être que lorsque c'est dans ce format, je peux les parcourir, supprimer toutes les marques '-' (Trait d'union) afin qu'elles soient laissées sous forme d'entiers, les trier à l'aide de array_sort() et les parcourir à nouveau pour les trier? Je préférerais qu'il y ait un autre moyen car je ferais 3 boucles avec cela par utilisateur.

Merci.

Edit: je pourrais aussi faire ceci:

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

Mais en utilisant cela, y aurait-il un moyen de trier le tableau en fonction de l'élément "db" seul?

Édition 2: var_dump initial mis à jour

18
Click Upvote

Utilisez l'ISO (yyyy-mm-dd) au lieu du format "anglais", puis utilisez simplement la fonction ksort pour les mettre dans le bon ordre.

Il n'est pas nécessaire de supprimer les tirets, ksort effectuera une comparaison alphanumérique sur les clés de chaîne, et le yyyy-mm-dd le format fonctionne parfaitement car l'ordre lexical est le même que l'ordre de date réel.

[~ # ~] modifier [~ # ~] Je vois que vous avez maintenant corrigé votre question pour montrer que vous avez réellement un tableau de tableaux , et que la clé de tri se trouve dans les sous-tableaux. Dans ce cas, vous devez utiliser uksort comme recommandé ailleurs, mais je vous recommande de procéder à votre propre modification et tri en fonction de la date formatée DB, plutôt qu'en analysant le format lisible par l'homme:

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

uksort($array, 'cmp');
42
Alnitak

En fait, utilisez ceci:

usort($array, "cmp");

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

:)

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

Je pense qu'il vaut mieux utiliser la fonction usort() au lieu de uksort(), car parfois vous ne pouvez pas utiliser de variables globales et de toute façon, l'utilisation de variables globales n'est pas non plus une bonne pratique.

4
Alexander

Vous pouvez également utiliser une fonction anonyme.

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