Question

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, le jour et l'année). Quelle est la meilleure façon de le faire?

A l'origine les e-mails sont récupérés par dans le 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 lorsque son dans ce format, je boucle à travers eux, supprimer tous les '-' (trait d'union) marques ils sont laissés en integars, trier les utiliser array_sort() et boucle à travers eux encore une fois pour les trier? Préférerions s'il y avait une autre façon que je ferais 3 boucles avec ce 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?

Edit 2: var_dump initiale Mise à jour

Était-ce utile?

La solution

Utilisez le format ISO (yyyy-mm-dd) plutôt que le format "anglais", puis il suffit d'utiliser la balise ksort fonction pour les obtenir dans le bon ordre.

Il n'y a pas besoin d'enlever les traits d'union, ksort fera une comparaison alphanumérique sur les touches de chaîne, et le format de yyyy-mm-dd fonctionne parfaitement bien que l'ordre lexical est le même que l'ordre de la date réelle.

EDIT Je vois que vous avez maintenant corrigé votre question pour montrer que vous avez bien un tableau de tableaux, et que la clé de tri est dans les sous-réseaux. Dans ce cas, vous devez utiliser uksort comme recommandé ailleurs, mais je vous recommande que d'aller avec votre propre modifier et trier en fonction de la date formatée DB, plutôt que par l'analyse du format lisible par l'homme:

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

uksort($array, 'cmp');

Autres conseils

En fait, utilisez ceci:

usort($array, "cmp");

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

:)

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

Je pense qu'il est préférable d'utiliser la fonction usort() au lieu de uksort(), parce que parfois tu ne peux pas utiliser des variables globales du tout et l'utilisation de toute façon les variables globales n'est pas une bonne pratique non plus.

Vous pouvez également utiliser la fonction anonyme.

// Sort in chronological order.
usort($array, function($a, $b) {
  return strcmp($a['db'], $b['db']);
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top