Tri Tableau dates

pipoulito -  
 pipoulito -
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

  1. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    Bonjour,

    Sous quelle forme sont stockées tes dates ?

    Xavier
    0
  2. pipoulito
     
    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
  3. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    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
  4. pipoulito
     
    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
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      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
    2. pipoulito
       
      d'accord merci mais c'est justement ce "tri simple" que je n'arrive pas à faire...
      pourrais tu m'aiguiller stp ?
      merci
      0
    3. pipoulito
       
      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
    4. pipoulito
       
      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
    5. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      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