Page 1 sur 1
Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 19 mars 2015, 00:17
par retrojex
Bonjour,
Alors je m'explique, dans mon code j'ai deux grande conditions if / else, je voudrais savoir s'il y avait un moyen d'interdire l'exécution de la partie else si la partie if n'a pas été faite avant au moins une fois ?
Croyez-vous que c'est possible ?
Merci d'avance
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 19 mars 2015, 09:52
par sirakawa
Une situation dans ce genre?
if (cond1)
{
}
else
{
}
if (cond2)
{
}
else
{
}
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 19 mars 2015, 15:09
par ynx
Salut,
Ou quelque chose comme ceci ?
$autoriseElse = false;
if (cond1) {
// on passe dans le if au moins une fois
$autoriseElse = true;
} else {
if ($autoriseElse) {
// on passe ici seulement si on est passé dans le if une fois
}
}
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 19 mars 2015, 16:32
par retrojex
Tout d'abord merci pour vos réponses, mais je pense plus que ma configuration est celle que ynx expose:
Je vous mets mon code:
Code : Tout sélectionner
$reg = "/[a-zA-Z]{3}\/[0-3][0-9]\/[0-9]{4}\s\-\s[0-2][0-9]:[0-5][0-9]\s(am|pm)/"; // Expression régulière de type date + heure Mois(3 lettres)/dd/aaaa - hh:mm (am|pm)
$try = preg_match($reg, $article['title']);
if ($try != 1) // Test si le titre n'est pas une date
{
$rezer = substr($article['title'], 2);
$text = preg_replace('#\(\s*[a-z0-9]*\s*\)*\s*#i', '', $rezer); // Enlèce les parenthèses ()
$text2 = preg_replace('#\[\s*[a-z0-9]*\s*\]*\s*#i', '', $text); // Enlève les crochets []
$text3 = preg_replace('#\{\s*[a-z0-9]*\s*\}*\s*#i', '', $text2); // Enlève les accolades {}
$req = 'SELECT Name FROM *** WHERE Name="'. $text3 .'"'; // Sélectionne le nom dans la DB où la colonne Name = $text3
$rs_queri = mysqli_query($acdb,$req); // Teste la requête
$rs = mysqli_num_rows($rs_queri);
if($rs >= 1) // Test si la Série est dans la BD
{
$reze = substr($article['title'], 2); // Enlève les 2 premiers caractères
$tor= "<li><p class='show_reg'>$reze</p></li>\n";
$page .= $tor;
}
if($rs === 0)
{
$reqr = 'SELECT Name2 FROM **** WHERE Name2= "'.$text3.'" '; // Sélectionne le nom dans la DB où la colonne Name = $te
$rs_query = mysqli_query($acdb,$reqr); // Teste la requête
$rst = mysqli_num_rows($rs_query); // Nombre de fois que la requête existe.
if($rst >= 1)
{
$reze = substr($article['title'], 2); // Enlève les 2 premiers caractères
$tor = "<li><p class='show_verif'>$reze</p></li>\n";
$page .= $tor;
}
else
{
$tor = '';
$page .= $tor;
}
}
}
else
{
$tr = substr($article['title'], -8); // Garde les 8 derniers caractères de la chaine
if($tr != "08:00 pm") // Test si les 8 derniers caractères sont différents à "08:00 pm"
{
$tar="";
$page .= $tar; // Ne marque rien si le test est valide
}
else // Sinon il écrit la date
{
$title = substr($article['title'], 0, -11);
$ex = explode("/", $title);
$day = intval($ex[1]);
$month = $ex[0];
$year = intval($ex[2]);
$date2 = array(++$day, $month, $year);
$date3=implode("/", $date2);
$tar = "<center><span class='date'>$date3</span></center>\n";
$page .= $tar;
}
}
En faite, c'est un lecteur RSS qui affiche un calendrier de série, sauf que la variable $article['title'] revoie dès fois une date et dès fois le nom de la série. Donc mes deux grandes parties IF / ELSE testent si la variable est de type date ou de type nom de série.
Ce que je voudrais c'est que la date s'affiche uniquement s'il y a un ou des titres de séries à afficher en dessous, vous voyez ?
Je suis désolé le code est un peu long et pas vraiment bien indenté. Mais il vérifie aussi que le nom des séries soient dans la BD, etc.
Merci d'avance pour les futures renseignements.
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 12:55
par retrojex
Personne n'a d'idée pour mon problème ? je prends toutes les réponses

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 13:44
par sirakawa
// Expression régulière de type date + heure Mois(3 lettres)/dd/aaaa - hh:mm (am|pm)
$reg = "/[a-zA-Z]{3}\/[0-3][0-9]\/[0-9]{4}\s\-\s[0-2][0-9]:[0-5][0-9]\s(am|pm)/";
$try = preg_match($reg, $article['title']);
$tor = ""; // déplacé assure qu'il existe toujours
if ($try != 1) //____________________________________________________Le titre n'est pas une date
{//1
// il y a plus bas reze qui a l'air identique
$rezer = substr($article['title'], 2);
//plus simple avec str_replace
$text3 = str_replace(
[
'(',')',
'{','+',
'[',
']'],
['','','','','','',''],
$rezer);
// Sélectionne le nom dans la DB où la colonne Name = $text3
$req = 'SELECT Name FROM *** WHERE Name="'. $text3 .'"';
$rs_query = mysqli_query($acdb,$req); // exécute la requête
$rs = mysqli_num_rows($rs_queri);
if($rs >= 1) //____Il existe au moins une série satisfaisant la requete dans la BDD
{//2
$tor= "<li><p class='show_reg'>$rezer</p></li>\n";
}
else //________________Il n'existe pas de série satisfaisant la requete dans la BDD
{//2
// Sélectionne le nom dans la DB où la colonne Name2 = $text3
$req = 'SELECT Name2 FROM **** WHERE Name2= "'.$text3.'" ';
$rs_query = mysqli_query($acdb,$req); // exécute la requête
$rst = mysqli_num_rows($rs_query); // Nombre de lignes satisfaisant la requête.
if($rst >= 1)//_____une série au moins satisfait la requete dans la BDD
{//3
$tor = "<li><p class='show_verif'>$rezer</p></li>\n";
}//3
//2}
// C'est ici qu'il faut traiter la date
}//1
$page .= $tor;
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 14:02
par retrojex
Oui j'ai eu cette idée aussi mais la date ne va pas rentrer dans la première boucle if, c'est ça mon problème.
Le flux RSS est de type
Code : Tout sélectionner
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>titre</title> ------> Renvoies les noms de séries et les dates.
<link>lien</link>
<description>desc</description>
</channel>
</rss>
Du coup, $article['title'] renvoie une date lorsque <title>date</title> et $article['title'] renvoie un nom de série lorsque <title>Nom de série</title>.
Je sais pas si c'est très clair mais voilà un apercu de ce que ça donne en vrai:
http://retrojex.comuf.com/try/rss-liens.php
Je voudrais éliminer les dates sous lesquels, il n'y a pas de shows.
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 14:52
par sirakawa
Ton lien ne donne rien
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 15:01
par retrojex
Désolé, j'ai un problème avec mon hébergeur...
Normalement le lien remarche

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 16:07
par sirakawa
Montre ce que tu reçois sous la forme où tu le recois.
Le lien c'est ce que tu voudrais obtenir ou à peu près ?
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 16:47
par retrojex
Le lien c'est ce que je reçois sous là forme où je le reçois. Cependant, tu as surement vu que certaines dates étaient "vides" de noms de séries. Je voudrais que ces dates disparaissent et que seules celles ayant une liste de séries (une ou plusieurs) en dessous s'affichent.
Tu vois ce que je veux dire ?
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 18:01
par sirakawa
Tu reçois une ligne:
21/Mar/2015
puis:
Glee (06x12)
Grimm (04x14)
Last Man Standing (04x19)
ou sous une autre forme
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 20 mars 2015, 18:05
par retrojex
A la base, le flux donne la date sous cette forme: - Mar/21/2015 - 08:00 am, l'heure change selon la date d'upload et donc je reçois les infos de bases sous cette forme:
- Mar/21/2015 - 08:00 am
- Glee (06x12)
- Grimm (04x14)
- Mar/21/2015 - 09:00 am
- The Big Bang Theory (08x15)
Etc, c'est un exemple mais c'est les infos de base sont de ce type.
Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés
Posté : 22 mars 2015, 14:56
par sirakawa
Je me suis amusé à ça:
<?PHP
function estdate ($texte)
{
$pattern = "/[a-zA-Z]{3}\/[0-3][0-9]\/[0-9]{4}\s\-\s[0-2][0-9]:[0-5][0-9]\s(am|pm)/";
$resultat = preg_match($pattern, $texte);
return ($resultat == 1) ? True: False;
}
$data = array(
"Mar/21/2015 - 08:00 am",
"Glee (06x12)",
"Grimm (04x14)",
"Mar/21/2015 - 09:00 am",
"The Big Bang Theory (08x15)",
"Mer/22/2015 - 08:00 am",
);
$nb = count ($data);
$i = 0;
$liste = array();
$k=0;
$l = 0;
while ($i < $nb)
{
$donnee = $data[$i];
if (estdate($donnee))
{
$j = $i+1;
$donnee1 = isset($data[$j]) ? $data[$j]: '' ;
$nondate = estdate ($donnee1);
$k = $l+1;
while (($j < $nb) and ($nondate == false))
{
$liste[$k] = $donnee;
$donnee1 = $data[$j];
$liste[$l++] = $donnee1;
$nondate = estdate ($donnee1);
$j++;
$i = ($nondate === false)? $i++:$i;
}
}
$i++;
}
foreach ($liste as $z)
print "$z<br>"
?>