Tri Tableau dates

Fermé
pipoulito - 3 avril 2014 à 09:13
 pipoulito - 3 avril 2014 à 13:50
Bonjour,

Debutant de chez debutant en php j'ai besoin d'ordonner (croissant) un tableau contenant des dates : Array ( [0] => sam. 5 / 07 [1] => lun. 30 / 06 [2] => dim. 6 / 07 ...etc..)
J'ai essayé usort avec la fonction cpm mais ça ne marche pas...
Merci de votre aide !!!


4 réponses

Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
3 avril 2014 à 11:03
Bonjour,

Sous quelle forme sont stockées tes dates ?

Xavier
0
Bonjour

Elles sont issues d'un strftime('%a %e / %m')
et donc un print_r donne ça : Array ( [0] => sam. 5 / 07 [1] => lun. 30 / 06 [2] => dim. 6 / 07 ...etc..)
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
3 avril 2014 à 11:41
Donc ce sont des chaines de caractères... Pour les trier, il faudrait sans doute les reconvertir en date ou en timestamp. Cela impose de connaître leur année...
Le mieux serait sans doute de les trier avant de les transformer.

Si ce n'est pas possible, tu peux essayer de les retransformer, par exemple en créant une fonction de ce genre :
function comparer($d1, $d2)
{
    $ts1 = backToTime($d1);
    $ts2 = backToTime($d2);

    if ($ts1 < $ts2) return -1;
    if ($ts1 > $ts2) return 1;
    return 0;
}

function backToTime($d)
{
    $pattern = '/\w+\. (\d+) \/ (\d+)/i';
    $replacement = '$1-$2-2014';
    return strtotime(preg_replace($pattern, $replacement, $d));
}

usort($tableau, comparer);

Attention, sur de gros volumes de données, ce ne sera sans doute pas optimal... Et si tu mélanges des années différentes, tu es foutu !

Xavier
0
Merci Xavier je vais regarder ça...

Mais un truc que je ne comprends pas...Je pensais avoir converti mes chaines de départ en dates, ce n'est donc pas le cas ? Voila ce que je fais :

$chaine: 01-07-2014
strftime('%a %e / %m', strtotime($chaine));
Merci de ton aide.
P.
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
3 avril 2014 à 11:57
strtotime signifie : « string to time ». Donc converti bien une chaîne de caractère en date.

Mais :
strftime signifie : « string from time ». Donc elle prend une date, et en donne une représentation littérale : une chaîne de caractère !

Du coup, si tu conserves uniquement
strtotime($chaine)
sans le strftime, tu pourras faire un tri bien plus simplement que ce que je te propose.

Xavier
0
d'accord merci mais c'est justement ce "tri simple" que je n'arrive pas à faire...
pourrais tu m'aiguiller stp ?
merci
0
et donc en partant d'une string 01-07-2014 pas la peine de faire pour avoir une "vraie" date:
date( "d/m/y", strtotime( $chaine ));
0
je commence à comprendre...En fait à la base j'ai un tableau qui comprend des chaines (01-07-2014)
Il faut que je convertisse toutes ces chaines en Time, que j'ordonne lui que je convertisse en date puisque au finel j'ai besoin d'afficher une date 01 Juil. 2014
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
3 avril 2014 à 12:16
La fonction date, tout comme la fonction strftime, est une fonction pour humains. Elle ne donne pas une date pour l'ordinateur : elle donne une chaîne de caractères que nous, humains, reconnaissons comme une date.

strtotime, à l'opposé, prend une date humaine pour la transformer en timestamp UNIX et donc, en date pour l'ordinateur.

Pour ton problème de tri, du coup, exécute ce petit bout de code :
$tab = array();
$tab[] = strtotime('01-07-2014');
$tab[] = strtotime('06-07-2014');
$tab[] = strtotime('04-07-2014');
$tab[] = strtotime('02-07-2014');
$tab[] = strtotime('10-06-2014');

sort($tab);

//affichage
foreach ($tab as $dt)
	echo date('d-M-Y', $dt) . PHP_EOL;


Tu remarqueras que je n'utilise « date » (ou « strftime ») que pour la partie humaine : l'affichage...
0