2014-04-25 4 views
-1

C'est le tableau non trié, dans le format jj-mm-aaaa:tableau de tri avec des dates avec asort() ne fonctionne pas correctement

array(6) { 
["7-0"]=> string(10) "28-04-2014" 
["7-1"]=> string(10) "29-04-2014" 
["7-2"]=> string(10) "30-04-2014" 
["7-3"]=> string(10) "01-05-2014" 
["7-5"]=> string(10) "26-04-2014" 
["7-6"]=> string(10) "27-04-2014" 
} 

Je suis maintenant en utilisant le tri:

array(6) { 
["7-3"]=> string(10) "01-05-2014" 
["7-5"]=> string(10) "26-04-2014" 
["7-6"]=> string(10) "27-04-2014" 
["7-0"]=> string(10) "28-04-2014" 
["7-1"]=> string(10) "29-04-2014" 
["7-2"]=> string(10) "30-04-2014" 
} 

En utilisant asort() pour trier le tableau par la valeur, mais ofcouse le 01 vient en premier. Y a-t-il un moyen pour moi de résoudre ce problème facilement? Il devrait être le dernier dans le tableau, donc c'est le mois prochain. (01-05-2014)

Mise à jour:

ci-dessus était la réponse var_dump() avant et après la asort(). Voici l'extrait de code ci-dessous. Après différentes tentatives, asort() a bien fonctionné jusqu'à cette semaine où c'est à peu près la fin du mois - alors le tableau n'est pas correctement trié.

$openhours_select = array(); 
foreach($openhours as $oh) 
{ 
     $d = date('d-m-Y', strtotime('this ' . $days[$oh['fromDay']])); 

     $openhours_select[$oh['id']] =$d; 

} 

asort($openhours_select); 
+4

Montrez-nous le code que vous avez essayé. Je ne peux pas vous aider à le réparer si nous ne pouvons pas le voir. J'ai du code prêt à partir mais je ne posterai pas jusqu'à ce que je voie un effort. –

+0

Désolé vient juste – Karem

+1

Qu'attendez-vous qu'il se passe? Les dates ** SONT ** triées, car ce sont des chaînes. Vous remarquerez que les jours sont tous dans l'ordre croissant. Si vous voulez un tri spécifique à la date, vous devez utiliser 'usort()' et fournir votre propre fonction de comparaison. –

Répondre

4

Ces dates ne sont pas dans un bon format pour le tri. Vous devez stocker les dates au format ISO-8601, qui sont faciles à trier et à reformater si nécessaire.

Mais pour contourner ce problème, vous pouvez utiliser DateTime::createFromFormat() pour lire la date dans un format comparable, puis les trier.

uasort($openhours_select, function($a, $b) { 
    $date1 = DateTime::createFromFormat('d-m-Y', $a); 
    $date2 = DateTime::createFromFormat('d-m-Y', $b); 
    return $date1 > $date2; 
}); 
+0

'uasort', probablement? – Ryan

+0

J'aime la solution, mais je perds les index clés – Karem

+0

@minitech Si elles veulent conserver leurs clés, c'est ce dont nous aurons besoin. Mise à jour de ma réponse maintenant –

1

besoin d'obtenir dans un meilleur format qui triera selon la date réelle:

array_multisort(array_map('strtotime', $array), SORT_ASC, $array); 

DEMO

+0

Grande réponse qui fonctionne aussi! +1 – Karem

+0

Pour les futurs lecteurs de cette réponse, cela ne fonctionne que si le séparateur de date est un tiret. Si c'est une barre oblique 'strtotime()' assumera MM/DD/YYYY et donnera des résultats incorrects. –

+0

Oui, la convention américaine est 'MM/DD' et Euro/autre est' DD-MM', donc si les conventions sont tenues tout va bien. Mais encore mieux d'utiliser YYYYMMDD ou la même chose avec des délimiteurs, alors il trie comme c'est sans aucun non-sens. – AbraCadaver

Questions connexes