Partage
  • Partager sur Facebook
  • Partager sur Twitter

Hacher menu une variable inoffensive ^^

et redisposer son contenu...

Sujet résolu
    2 mai 2006 à 18:38:48

    Bonjour,

    J'ai fouillé sans succès les tutoriels du site à la recherche d'une façon pour "découper" une variable et en redisposer le contenu.

    Petit exemple :
    J'ai des dates enregistrées dans ma base de données dans ce format :
    20050627 (année 2005 - mois 06 - jour 27)
    À la base c'était pour la pure simplicité d'effectuer un tri par ordre de grandeur dans la base de données. Ce n'était certainement pas la meilleure solution je vous l'accorde. Cependant le nombre d'entrées étant considérables, et désirant afficher la date de façon lisible (27/06/2005 par exemple), je cherche une solution pour "casser" cette variable et la redisposer correctement.

    Quelles fonctions rechercher ? Quelles suggestions pourriez-vous me donner ?

    Merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      2 mai 2006 à 18:52:56

      Tu as plusieurs solutions:

      Soit par les regex: un simple preg_replace fait ce qu'il faut : preg_replace('`(\d{4})(\d{2})(\d{2})`','$3/$2/$1',$var);

      Soit avec des substr: substr($var,6,2).'/'.substr($var,4,2).'/'.substr($var,0,4);

      ...
      • Partager sur Facebook
      • Partager sur Twitter
        2 mai 2006 à 18:59:28

        substr() je pense...
        Ou alors comme c'est des nombres:
        <?php $annees = ceil($nombre / 10000);
        $mois = ceil(($nombre - 10000 * $annees) / 100);
        $jour = ceil($nombre - 10000 * $annees - 100 * $mois);
        ?>

        (enfin j'ai pas testé mais ca doit marcher ca...)
        • Partager sur Facebook
        • Partager sur Twitter
          2 mai 2006 à 19:25:50

          Citation : Vizigr0u

          substr() je pense...
          Ou alors comme c'est des nombres:

          <?php $annees = ceil($nombre / 10000);
          $mois = ceil(($nombre - 10000 * $annees) / 100);
          $jour = ceil($nombre - 10000 * $annees - 100 * $mois);
          ?>


          (enfin j'ai pas testé mais ca doit marcher ca...)

          hum, en fait ça marche pas du tout ton truc... déja ceil c'est pas un bon choix:
          par exemple avec la date 20060306 il va trouvé l'année 2007
          ensuite il donne des dates négatives

          Et de toute façon il est 4 fois plus lent :p (le plus rapide sous PHP4 étant celui avec la regex... et avec les substr sous PHP5)
          • Partager sur Facebook
          • Partager sur Twitter
            2 mai 2006 à 19:37:12

            lol ok enfin bon, moi j'ai pas mal programmé des trucs vite fait sur caltos alors j'ai pris un peu l'habitude de stoquer et lire des donnees dans un seul nombre ;)
            Et puis je ne proposais qu'une alternative :D
            Le substr était en effet d'après moi la bonne solution (par contre je savais pas pour la différence de temps avec php4 et les regex)
            • Partager sur Facebook
            • Partager sur Twitter
              3 mai 2006 à 3:06:29

              Bonjour vous deux et merci pour les suggestions !

              Citation : targuan

              Soit par les regex: un simple preg_replace fait ce qu'il faut : preg_replace('`(\d{4})(\d{2})(\d{2})`','$3/$2/$1',$var);
              Soit avec des substr: substr($var,6,2).'/'.substr($var,4,2).'/'.substr($var,0,4);


              Je vais essayer ces deux solutions :)
              • Partager sur Facebook
              • Partager sur Twitter
                3 mai 2006 à 3:55:22

                Pourquoi ne pas sauvegarder les dates dans ta BDD simplement sous le type date? et apres formuler ta requete SQL directement pour obtenir une date formatée ?
                • Partager sur Facebook
                • Partager sur Twitter
                  3 mai 2006 à 15:08:06

                  @ Sh4rk

                  Citation : Co

                  À la base c'était pour la pure simplicité d'effectuer un tri par ordre de grandeur dans la base de données. Ce n'était certainement pas la meilleure solution je vous l'accorde. Cependant le nombre d'entrées étant considérables [..]


                  Je ne le referais pas de cette façon, c'est clair.

                  Et sinon j'ai essayé la fonction substr() et c'est parfait, ça me donne quelque chose de ce type (j'ai fractionné les variables afin de pouvoir interchanger les jour / mois / an en cas de changement de langue.

                  Comme d'hab le dictionnaire des fonctions de php.net s'est révélé plus qu'utile puisque je ne la connaissais pas ^^

                  Merci encore à tous pour vos suggestions.

                  // $postdate étant la variable issue de la bdd
                  $day = substr($postdate, 6, 2);
                  $month = substr($postdate, 4, 2);
                  $year = substr($postdate, 0, 4);
                  $postdate = $day . "/" . $month . "/" . $year;
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 mai 2006 à 17:36:12

                    et pourquoi ne pas developper un petit script qui te permet de copier toutes tes entrees de type int dans un nouveau champs de type date comme ca ca sera plus optimisé
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 mai 2006 à 17:54:56

                      $postdate = 20060306;
                      $year = $postdate{0}.$postdate{1}.$postdate{2}.$postdate{3};
                      $month = $postdate{4}.$postdate{5};
                      $day = $postdate{6}.$postdate{7};
                      $postdate = $day . "/" . $month . "/" . $year;


                      c'est un peu plus long comme code, mais c'est plus rapide que les regex et même substr

                      edit: mais je suis quand même d'accord avec l'idée de Sh4rk :p
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 mai 2006 à 18:22:15

                        Il marche pas ton code MaxDc: tu peux pas utiliser $var{0} sur un int...donc il faudrait rajouter $postdate=(string)$postdate;

                        Et d'après mes tests il est plus lent que les regex ou les substr :o ...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 mai 2006 à 18:35:50

                          ah oui, petite erreur ^^ (m'enfin, moi j'avais testé avec un $_POST, donc il était déjà en string ( :p )


                          // Temps: 3.4

                          $postdate = (string)20060306;
                          $year = $postdate{0}.$postdate{1}.$postdate{2}.$postdate{3};
                          $month = $postdate{4}.$postdate{5};
                          $day = $postdate{6}.$postdate{7};
                          $postdate = $day . "/" . $month . "/" . $year;



                          // Temps: 4.0

                          $postdate = 20060306;
                          $day = substr($postdate, 6, 2);
                          $month = substr($postdate, 4, 2);
                          $year = substr($postdate, 0, 4);
                          $postdate = $day . "/" . $month . "/" . $year;



                          // Temps: 3.4 aussi, je l'aurais pas cru ^^

                          $postdate = 20060306;
                          $postdate = preg_replace('`(\d{4})(\d{2})(\d{2})`','$3/$2/$1',$postdate);


                          edit: testé avec php4
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Hacher menu une variable inoffensive ^^

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown