Logique php

Fermé
nag - 28 mai 2009 à 00:59
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012 - 28 mai 2009 à 12:43
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.
A voir également:

25 réponses

Problème résolue merci.
0
Problème règlé merci pour l'aide.
0
shadowmen121 Messages postés 124 Date d'inscription dimanche 8 juillet 2007 Statut Membre Dernière intervention 1 décembre 2013 27
28 mai 2009 à 02:47
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
bizu53 Messages postés 1274 Date d'inscription samedi 30 août 2008 Statut Membre Dernière intervention 21 juin 2015 860
28 mai 2009 à 03:39
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
irem Messages postés 164 Date d'inscription mardi 22 mai 2007 Statut Membre Dernière intervention 9 octobre 2012 99
28 mai 2009 à 04:19
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
Isa__ Messages postés 57 Date d'inscription samedi 10 septembre 2005 Statut Membre Dernière intervention 14 octobre 2011 2
28 mai 2009 à 06:41
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
Isa__ Messages postés 57 Date d'inscription samedi 10 septembre 2005 Statut Membre Dernière intervention 14 octobre 2011 2
28 mai 2009 à 06:44
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
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
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
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
Mini sheep Messages postés 181 Date d'inscription vendredi 21 décembre 2007 Statut Membre Dernière intervention 20 octobre 2021 27
28 mai 2009 à 08:57
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
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
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012 44
28 mai 2009 à 09:03
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
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012 44
28 mai 2009 à 09:09
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
Yorundr Messages postés 289 Date d'inscription mardi 31 octobre 2006 Statut Membre Dernière intervention 11 juin 2012 44
28 mai 2009 à 09:09
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
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
raph0351 Messages postés 369 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 17 mai 2011 14
28 mai 2009 à 09:45
as tu essayé de repartir avec un if apré else??
0
bebertii Messages postés 165 Date d'inscription dimanche 15 avril 2007 Statut Membre Dernière intervention 25 septembre 2015 26
28 mai 2009 à 09:56
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
romrom7777 Messages postés 65 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 30 juin 2009 11
28 mai 2009 à 09:58
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
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