Logique php

Bonjour,

J'ai tenté de faire un code php qui me disait l'age, le signe du zodiaque et l'astrologie chinoise des gens.

Donc résultat, les 2 premiers marchent mais j'ai du mal pour le 3e.

Voilà les conditions:

1999 fév. 16 à 2000 fév. 04 = signe astro est lièvre

voici le code que sa donne:

if(($annee == 1999 and $jour>16 and $mois==2) or ($annee == 1999 and $mois>2) or ($annee==2000 and $jour<04 and $mois==2) or ($annee==2000 and $mois==1)) 

{
$chinois = "Lièvre";
}


donc j'aimerais que l'on maide à continuer le code.

if(($annee == 1999 and $jour>16 and $mois==2) or ($annee == 1999 and $mois>2) or ($annee==2000 and $jour<04 and $mois==2) or ($annee==2000 and $mois==1)) 

{
$chinois = "Lièvre";
}

else


voila apes ''else''

c'est là que vous dever mettre les condition suivantes:

2000 fév. 05 à 2001 jan. 23 = dragon

De plus, j'aimerais que vous me disiez comment vous avez fait pour faire le bout de code car je ne voit pas la logique de comment le faire. Le premier bout de code provient de mon professeur.

Un gros merci à celui qui réussiras.
Configuration: Windows XP Internet Explorer 7.0

25 réponses

Résumé de la discussion

Une demande porte sur l'attribution du signe astrologique chinois à partir d'une date en PHP, l'intervalle 1999-02-16 à 2000-02-04 donnant Lièvre comme premier signe et comment l'intégrer dans un script fiable. Plusieurs réponses suggèrent d'utiliser une structure conditionnelle en cascade (if/else if) pour tester chaque intervalle et attribuer le signe approprié, ou d'employer des timestamps pour des comparaisons simples et robustes. La méthode retenue dans l'échange peut être soit une suite d'else if couvrant Dragon, Lièvre et les autres signes, soit une conversion date AAAAMMJJ pour des tests directs et lisibles.

Bobot (l’IA à votre service)
  1. Problème règlé merci pour l'aide.
    0
    1. Salut,

      en fait, ton code logique n'est pas correcte. En fait, sous PHP l'appelation " or " est défini comme " || " et " and " comme " && ". Dès lors, tu obtiens:

      <?php

      if(($annee == 1999 && $jour>=16 && $mois==2) || ($annee == 1999 && $mois>2) || ($annee==2000 && $jour<=4 && $mois==2) || ($annee==2000 && $mois==1))

      {
      $chinois = "Lièvre";
      }

      elseif

      ...

      ?>

      Fait simplement attention, je crois que certaine de tes conditions sont pas " correcte "... Est-ce normal que ta deuxième condition ne comporte pas de jour ?

      Sinon tu as l'idée général... Je ne l'ai malheureusement pas testé mais ceci devrait être exacte!

      Bonne chance,

      Cordialement
      0
      1. Tu as 3 variables, qui sont $jour $mois et $annee, mais la machine qui exécute ton code ne sait rien... elle ne sait pas que le 1 septembre 1999 est après le 2 août 1999 ni rien.
        Pour tester si une date X est après une date Y :
        si X et Y sont du même mois de la même année, X est après Y si le jour de X est supérieur à celui de Y
        si X et Y ne sont pas du même mois mais de la même année, tu n'as qu'à tester si le mois de X est après celui de Y
        si X et Y ne sont pas de la même année, tu n'as qu'à tester si l'année de X est après l'année de Y.

        C'est cette logique là qui a été utilisée.

        C'est très lourd, et c'est moche... moi j'utilise un moyen énormément plus simple pour comparer des dates, c'est juste une petite astuce à savoir :

        Lorsqu'on écrit une date JJ/MM/AAAA dans le sens AAAAMMJJ, l'ordre chronologique correspond à l'ordre alphabétique ! :)

        Pour ton code ça le simplifie en :

        $date=1000*$annee+100*$mois+$jour; //pour avoir le format AAAAMMJJ
        if($date >= 19990216 && $date <= 20000204) {
           $chinois = "Lièvre";
        } else {
           if($date >= 20000205 && $date <= 20010123) {
              $chinois = "Dragon";
           }
        }


        ----------
        Au passage, ce que t'as donné ton prof (si tu l'as bien recopié) est faux, correction :
        if(($annee == 1999 and $jour>=16 and $mois==2) or ($annee == 1999 and $mois>2) or ($annee==2000 and $jour<=4 and $mois==2) or ($annee==2000 and $mois==1)) 
        ...
        0
        1. Bonjour,

          Perso je partirai sur un timestamp de la fin du signe (nombre de secondes ecoulées depuis le 1er janvier 70) et un tableau des signes (dans l'ordre chronologique), par exemple

          $table_signes=Array("dragon"=>t1,"lievre"=>t2,....);

          ensuite a partir du $T recherché, dès que l'entrée dépasse la valeur et l'entrée précédente est inférieure, le signe était le bon

          $current_deb=mktime(date loin dans le temps);
          for each($table_signes as $key=>$value) {
             if ( ($value>$T)  && ($current_deb<$T)) {
                 echo $key; // on a le bon signe
                }
             else
               {
               $current_deb=$value;
               }
          }


          voili voulou
          0
          1. Bonjour,

            Utilse plutot un switch...

            Voici la syntaxe :

            switch (Variable) {

            case Valeur1 :
            Liste d'instructions
            break;

            case Valeur2 :
            Liste d'instructions
            break;

            case Valeurs... :
            Liste d'instructions
            break;

            default:

            Liste d'instructions
            break;

            }
            C'est plus clair et ça t'évite des if dans tous les sens..

            Bon courage

            Isa
            0
            1. Bonjour,

              Utilise plutot un switch dont voici la syntaxe :
              switch (Variable) {

              case Valeur1 :
              Liste d'instructions
              break;

              case Valeur2 :
              Liste d'instructions
              break;

              case Valeurs... :
              Liste d'instructions
              break;

              }
              Bon courage

              Isa
              0
              1. if(($annee == 1999 and $jour>5 and $mois==2) or ($annee == 2000 and $mois>2) or ($annee==2001 and $jour<04 and $mois==2) or ($annee==2000 and $mois==1))
                {
                $chinois = "Lièvre";
                }
                else
                {
                if(($annee == 2000 and $jour>16 and $mois==2) or ($annee == 1999 and $mois>2) or ($annee==2000 and $jour<23 and $mois==1))
                {
                $chinois = "Dragon";
                }
                }

                Voila je pense que c'est ça fait un essai ;)
                C'etait quand même pas très dur avec le modèle, seulement de la logique.
                0
                1. else
                  {
                  if(($annee ==2000 and $jour>5 and $mois==2) or ($annee == 2000 and $mois>2) or ($annee==2001 and $jour<23 and $mois==1))
                  {
                  $chinois = "Dragon";
                  }
                  }
                  0
                  1. else
                    {
                    if(($annee == 2000 and $jour>5 and $mois==2) or ($annee == 2000 and $mois>2) or ($annee==2001 and $jour<23 and $mois==1))
                    {
                    $chinois = "Dragon";
                    }
                    }
                    0
                    1. Peronnelement je connais pas les signe astrologique chinois mais pour le code, je peux t'expliquer.
                      Apres ton else, tu peux continuer avec un "if"
                      comme ca tu reecris le meme code en changant l'année, le mois et aussi le resultat et tu fait ca jusqu'a ce que tu fasse tous les signes.
                      if
                      else
                      if
                      else ...
                      Je sais faire le meilleur comme le pire, mais c'est dans le pire que je suis le meilleur.
                      0
                      1. Bonjour,

                        Voici la traduction du code de la première ligne.

                        if(($annee == 1999 and $jour>16 and $mois==2) or ($annee == 1999 and $mois>2) or ($annee==2000 and $jour<04 and $mois==2) or ($annee==2000 and $mois==1))

                        {
                        $chinois = "Lièvre";
                        }

                        SOIT
                        si ((l'année est égale à 1999 et le jour supérieur à 16 et le mois égal à 2) ou (si l'année est égale à 1999 et le mois supérieur à 2) ou (l'année égale à 2000 et le jour inférieur à 4 et le mois égal à 2) ou (l'année est égale à 2000 et le mois égal à 1))

                        {le signe chinois est "lièvre";}
                        0
                        1. Salut,

                          heu moi je suis pas très fan de ton bout de code, j'aurais fait un truc plus simple, mais plus logique a la fois. j'aurais transformé chaque date en TimeStamp que j'aurais comparé, un peu comme ca :

                          $timestampDebutPeriode = mktime(0,0,0, 2, 16, 1999); //16 fevrier 1999
                          $timestampFinPeriode = mktime(0,0,0, 2, 4, 2000); //4 fevrier 1999

                          voila l'encadrement pour le liévre, maintenant tu fait pareil pour ta date a toi et apres un simple if :

                          if ($timestampPeriodeDebut>=$timestampMaDate) && ($timestampMaDate>=$timestampPeriodeFin)
                          $chinois = "lievre";

                          et voila un if par signe chinois et c'est bon..

                          PS: Plutot que du "j'aimerais que vous me disiez..." tu devrait dire du "Pourriez vous me dire...", ca fait moins "Ordre"
                          0
                          1. Bonjour,

                            heu.. je suis pas trés fan de la facon dont ton prof a fait... Il y a plus simple et moins bricolage...

                            en passant par les timestamp. En gros tu converti chaque date en timestamp et apres tu les compare, c'est beaucoup mieu je trouve
                            exemple :

                            $timestampDebutPeriode=mkdir(0,0,0,2,16,1999)//16 fevrier 1999
                            $timestampFinPeriode=mkdir(0,0,0,2,4,2000)//4 fevrier 2000
                            $timestampMaDate =...

                            if ($timestampDebutPeriode>=$timestampMaDate) && ($timestampMaDate <= $timestampFinPeriode)
                            $chinois = "Lievre";

                            et tu repete ca pour chaque signe et voila

                            PS : tu devrait eviter les "j'aimerais que ..." et les remplacer par des "Pourriez vous svp..." ca donnerai moin l'impression que tu nous donne des ordres...
                            0
                            1. Bonjour,

                              heu.. je suis pas trés fan de la facon dont ton prof a fait... Il y a plus simple et moins bricolage...

                              en passant par les timestamp. En gros tu converti chaque date en timestamp et apres tu les compare, c'est beaucoup mieu je trouve
                              exemple :

                              $timestampDebutPeriode=mkdir(0,0,0,2,16,1999)//16 fevrier 1999
                              $timestampFinPeriode=mkdir(0,0,0,2,4,2000)//4 fevrier 2000
                              $timestampMaDate =...

                              if ($timestampDebutPeriode>=$timestampMaDate) && ($timestampMaDate <= $timestampFinPeriode)
                              $chinois = "Lievre";

                              et tu repete ca pour chaque signe et voila

                              PS : tu devrait eviter les "j'aimerais que ..." et les remplacer par des "Pourriez vous svp..." ca donnerai moin l'impression que tu nous donne des ordres...
                              0
                              1. Pour moi la suite est :

                                if(($annee == 2000 and $jour>=5 and $mois>=2) or ($annee == 2001 and $mois==1 and $jour<23))

                                {
                                $chinois = "Dragon";
                                }

                                La j'ai utilisé les signes >=...
                                a=b --> a prend la valeur de b
                                a==b --> a strictement égal à b
                                a<b --> a strictement inférieur à b
                                a>b --> a strictement supérieur à b
                                a>=b --> a supérieur ou égal à b
                                a<=b --> a inférieur ou égal à b
                                a!=b --> a différent de b

                                Ton prof lui met la date précise de début, la date précise de fin et la fourchette entre les deux.
                                Là moi j'ai mis la fourchette entre les deux dates.
                                0
                                1. as tu essayé de repartir avec un if apré else??
                                  0
                                  1. Salut,
                                    Je ne mettrais pas un "else", mais un autre "if" et ainsi de suite jusqu'à avoir fait le tour du calendrier.
                                    Cela te permettra de ne pas attribuer un signe à quelqu'un qui aurait entré le 30/02/1985 comme date.
                                    Sinon avec le else, il te faudrait une structure du type :
                                    if
                                    {
                                    valeur 1
                                    }
                                    else
                                    {
                                    if
                                    {
                                    valeur 2
                                    }
                                    else
                                    {
                                    if...
                                    0
                                    1. Bonjour,

                                      if(($annee == 1999 and $jour>16 and $mois==2) or ($annee == 1999 and $mois>2) or ($annee==2000 and $jour<04 and $mois==2) or ($annee==2000 and $mois==1))

                                      {
                                      $chinois = "Lièvre";
                                      }

                                      else if (($annee == 2000 and $jour>5 and $mois==2) or ($annee == 2000 and $mois>2) or ($annee==2001 and $jour<23 and $mois==2) or ($annee==2001 and $mois==1))

                                      {
                                      $chinois = "Dragon";
                                      }
                                      0
                                      1. C'est assez simple .... il s'agit d'algorithme de base....
                                        en php if suffit d'imbriquer les if / else
                                        if (<CONDITION1> == VRAI) {
                                        <Code Action 1>
                                        } else {
                                        if (<CONDITION2> == VRAI) {
                                        <Code Action 2>
                                        } else {
                                        if (<CONDITION3> == VRAI) {
                                        ...
                                        }

                                        Pour la condition sur la date chinoise ... réfléchir sur le même principe que ton exemple...

                                        Bref :
                                        va voir des exemple de code PHP, le PHP est un langage assez simple utilisé de façon séquentiel en object c'est une autre affaire .. ;) ;) ;)
                                        0
                                        • 1
                                        • 2