A voir également:
- Tri Tableau dates
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Trier tableau excel - Guide
- Tableau word - Guide
- Le nom du champ de tableau croisé dynamique n'est pas valide ✓ - Forum Excel
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
3 avril 2014 à 11:03
Bonjour,
Sous quelle forme sont stockées tes dates ?
Xavier
Sous quelle forme sont stockées tes dates ?
Xavier
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..)
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..)
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
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 :
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
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
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.
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.
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
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
Xavier
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
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
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 :
Tu remarqueras que je n'utilise « date » (ou « strftime ») que pour la partie humaine : l'affichage...
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...