sortir une variable d'une boucle

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : sortir une variable d'une boucle

par VaN » 08 nov. 2005, 16:10

Trouvé !!!

je savis bien que la solution résidait dans le fait de récuperer $a à la fin de la boucle et de le re-injecter dans la boucle suivante !

Voilà le script, un peu bricolé, pour ceux qui ont participé au thread, merci :
<?php 
                                  
                // on recupere l'id_user de chaque reservation sur la soirée donnée 
                $query_res = array( 
                array("username"=>"toto","nb_pc"=>10,"ID"=>1), 
                array("username"=>"momo","nb_pc"=>5,"ID"=>2), 
                array("username"=>"popo","nb_pc"=>14,"ID"=>3) 
                ); 
                  
                // si la requete renvoie quelquechose, on execute la boucle 
                if ($query_res) 
                {      
                    foreach($query_res as $result_res) 
                    {      
                        if (!isset($b))
						{
							$b = 1;
						}
						
						for ($a=$b; $a<=($result_res['nb_pc']+$b); $a++) 
						{ 
							if (($a == '7') || ($a == '13'))
							// le nombre de case maximum du tableau est de 18, 
							// pas la peine d'aller plus loin donc.
							{ 
								echo "<tr>\n";
							} 
							echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\">".$result_res['ID']."<br>a = ".$a."<br>b = ".$b."</td>\n"; 
						}
						$b = $a;
                    }                      
                } 
?>

par VaN » 08 nov. 2005, 15:10

je viens de tester ton code. ok le principe est la, mais je souhaiterais que les reservations des différents USER soient toutes dans le meme tableau.
Fonctionnement :
La requête trouve le nombre de pc réservés par utilisateur puis une boucle schèmatise les pc selon leur nombre dans une grille de 6 colonnes et n lignes et ce pour chaque utilisateur.
Justement, il ne faut pas créer une grille par utilisateur, mais une grille générale, et là ou je bloque, ne pas passer à la ligne entre chaque reservation.

j'ai modifié ton code de cette manière :
<table width="100%"  border="1" align="center"> 
<tr> 
<?php 
                                  
                // on recupere l'id_user de chaque reservation sur la soirée donnée 
                $query_res = array( 
                array("username"=>"toto","nb_pc"=>10,"ID"=>1), 
                array("username"=>"momo","nb_pc"=>5,"ID"=>2), 
                array("username"=>"popo","nb_pc"=>14,"ID"=>3) 
                ); 
                  
                // si la requete renvoie quelquechose, on execute la boucle 
                if ($query_res) 
                {      
                    foreach($query_res as $result_res) 
                    {      
                        
                        for ($a=1; $a<=$result_res['nb_pc']; $a++) 
                        { 
                            if (($a-1) % 6 == 0) 
                            { 
                                echo "<tr>"; 
                            } 
                            echo "<td title="r&eacute;serv&eacute; par ".$result_res['username'].""><img src="pc_res.gif" width="13" />".$result_res['ID']."</td>"; 
                        } 
                       
                    } 
                                         
                } 
?> 
                
</table>
ce qui donne ça : http://vanwork.nuxit.net/goodgame/calendrier/test.php
Mais il y'a toujours ce probleme de retour à la ligne.

Je viens de regarder le code généré, c'est pas extra en plus :

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Document sans nom</title> </head> <body> <table width="100%" border="1" align="center"> <tr> <tr> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <tr> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <td title="r&eacute;serv&eacute; par toto"><img src="pc_res.gif" width="13" />1</td> <tr> <td title="r&eacute;serv&eacute; par momo"><img src="pc_res.gif" width="13" />2</td> <td title="r&eacute;serv&eacute; par momo"><img src="pc_res.gif" width="13" />2</td> <td title="r&eacute;serv&eacute; par momo"><img src="pc_res.gif" width="13" />2</td> <td title="r&eacute;serv&eacute; par momo"><img src="pc_res.gif" width="13" />2</td> <td title="r&eacute;serv&eacute; par momo"><img src="pc_res.gif" width="13" />2</td> <tr> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <tr> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <tr> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> <td title="r&eacute;serv&eacute; par popo"><img src="pc_res.gif" width="13" />3</td> </table> </body> </html>
le probleme vient du fait qu'une fois qu'il a finit la boucle de USER 1, il passe à la boucle de USER 2, et ré-initialise $a à 1. et donc vue que ($a - 1) % 6 = 0, il ecrit le <tr>.

d'aileurs ça se voit à l'ouverture du tableau, le script à crée deux <tr> à la suite.

par sadeq » 08 nov. 2005, 09:52

voici ton programme telque je l'ai compris : qui affiche la liste des pc réservés par utilisateur sous forme de blocs de 6 carrés par ligne.

Fonctionnement :
La requête trouve le nombre de pc réservés par utilisateur puis une boucle schèmatise les pc selon leur nombre dans une grille de 6 colonnes et n lignes et ce pour chaque utilisateur.

Dans le cadre de ton calendrier ceci se passe pour une date donnée.

Voici le code, où ta requête est remplacée par un tableau pour simplifier les tests :
<table width="100%"  border="1" align="center">
<tr> 
<?php 
                                 
                // on recupere l'id_user de chaque reservation sur la soirée donnée 
                $query_res = array(
				array("username"=>"toto","nb_pc"=>10),
				array("username"=>"momo","nb_pc"=>5),
				array("username"=>"popo","nb_pc"=>14)
				); 
                 
                // si la requete renvoie quelquechose, on execute la boucle 
                if ($query_res) 
                {     
                    foreach($query_res as $result_res) 
                    {     
                        echo "<table><legend>r&eacute;serv&eacute; par ".$result_res['username']."</legend>";
						for ($a=1; $a<=$result_res['nb_pc']; $a++) 
                        { 
                            if (($a-1) % 6 == 0) 
                            { 
                                echo "<tr>"; 
                            } 
                            echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"pc_res.gif\" width=\"13\" /></td>"; 
                        }
						echo "</table><p>" ;
                    } 
                                        
                } 
?> 
               
</table>
Essaye de réadapter ce code.

par VaN » 07 nov. 2005, 18:54

@ sadeq : je n'obtiens pas vraiment le resultat désiré :lol:

http://vanwork.nuxit.net/goodgame/calen ... isplay.php
Tiens, voilà un exemple pour illustrer le principe complet, à toi de l'dapter à tes besoins:
<?php
$tableau = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24");
for($i = 0; $i < 24; $i++)
{
    /* On vérifie si on est au premier élément d'une ligne pour ouvrir la ligne du tableau, le reste de $i par 6 */
    echo(($i % 6 == 0) ? "  <tr>\n" : "");
    /* On ajoute l'élément */
    echo("    <td>". $tableau[$i] ."</td>\n");
    /* On vérifie si on est au dernier élément de la ligne, donc le reste de ($i - 1) par 6 */
    echo((($i + 1) % 6 == 0) ? "  </tr>\n" : "");
}
?>
Ce code va générer un tableau de six colonnes de large. Attention, si le nombre d'éléments ne correspond pas à un multiple de 6, il faudra ajouter d'autres éléments pour créer des cellules vides et compléter la structure du tableau en structure conforme.
Ca je le comprends bien je pense. C'est le niveau 1 de mon script. Mais la où le bas blesse, c'est que cette boucle, est elle-même comprise dans une autre boucle, parce que chaque case n'est pas liée au meme USER_ID, il me faut donc une boucle pour le USER_ID 1, puis une boucle pour le USER_ID 2, etc.. et c'est la que ça ne marche plus, pour fait le lien entre la fin de la boucle pour ID 1 et le debut de la boucle pour ID 2.

par sadeq » 07 nov. 2005, 18:24

Je croix que tu doit intégrer une sous-table dans la case où tu liste les images "carré rouge". to code est correct, il faut simplement ajouter :
un echo "<table>"; avant la boucle de $a et un echo "</table>" après
ça va donner ça :
<?php 
while($result_res = mysql_fetch_array($query_res)) 
                    {
                       echo "<table>";     
                        for ($a=1; $a<=$result_res['nb_pc']; $a+=1) 
                        { 
                            if (($a-1) % 6 == 0) 
                            { 
                                echo "</tr><tr>"; 
                            } 
                            echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"img/pc_res.gif\" width=\"13\" />$a</td>"; 
                        } 
                       echo "</table>";
} 
?>

par Cyrano » 05 nov. 2005, 09:43

Tiens, voilà un exemple pour illustrer le principe complet, à toi de l'dapter à tes besoins:
<?php
$tableau = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24");
for($i = 0; $i < 24; $i++)
{
    /* On vérifie si on est au premier élément d'une ligne pour ouvrir la ligne du tableau, le reste de $i par 6 */
    echo(($i % 6 == 0) ? "  <tr>\n" : "");
    /* On ajoute l'élément */
    echo("    <td>". $tableau[$i] ."</td>\n");
    /* On vérifie si on est au dernier élément de la ligne, donc le reste de ($i - 1) par 6 */
    echo((($i + 1) % 6 == 0) ? "  </tr>\n" : "");
}
?>
Ce code va générer un tableau de six colonnes de large. Attention, si le nombre d'éléments ne correspond pas à un multiple de 6, il faudra ajouter d'autres éléments pour créer des cellules vides et compléter la structure du tableau en structure conforme.

par VaN » 04 nov. 2005, 17:32

Je vais encore tenter de simplifier mon probleme :

Sur cette page, http://vanwork.nuxit.net/goodgame/calen ... isplay.php, dans la case du vendredi 4, au lieu d'avoir :

-------------------------
| 1 | 2 | 3 |
| 1 | 2 | 3 | 4 | 5 |
-------------------------

j'aimerais avoir

-------------------------
| 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 |
--------------------------

a chaque fois que le chiffre est un multiple de 6, le tableau retourne à la ligne.

le code actuel :
<?php
while($result_res = mysql_fetch_array($query_res))
					{	
						for ($a=1; $a<=$result_res['nb_pc']; $a+=1)
						{
							if (($a-1) % 6 == 0)
							{
								echo "</tr><tr>";
							} 
							echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"img/pc_res.gif\" width=\"13\" />$a</td>"; 
						}
					}
?>

par VaN » 04 nov. 2005, 16:10

en trifouillant un peu, j'ai réussi a afficher les cases exactement de la manière dont je voulais qu'elles s'affichent. comme ça, sur la case du vendredi 4 : http://vanwork.nuxit.net/goodgame/calen ... splay3.php

pour obtenir ce resultat, j'ai changer
<?php
if (($a-1) % 6 == 0)
{
	echo "</tr><tr>";
}
en
if (($a+2) % 6 == 0)
{
	echo "</tr><tr>";
} 
Or, je suis à peu près persuadé que ce n'est pas la bonne methode, car cela ne fonctionne pas pour les autres cases. Mais au moins cela permet de voir ce qu'il faudrait que ça fasse

je suis à peu près sur que la solution réside dans le fait de sortir le $a du if(), pour le reutiliser dans le prochain tour de if(), pour ne pas revenir à la ligne.

par VaN » 04 nov. 2005, 15:50

non pas tout à fait. la boucle que tu me propose, c'et ce que j'avais avant, même elle ne prenait pas en compte par qui avait été faite la reservation.

j'ai uploadé tout ça sur mon serveur pour que ça soit plus aisé :

mon script avec le while() et le for() : http://vanwork.nuxit.net/goodgame/calen ... isplay.php
Quand on passe la souris sur les cases du vendredi 4, on voit par qui la réservation a été faite.
<table width="100%"  border="1" align="center">
				<tr>
				<?php
				$date = $current_year."-".$current_month."-".$i;
				$sql_check_soiree = "SELECT id_soiree, date, pc_libres
									FROM  calendar_soiree
									WHERE date='".$date."'";
				$query_check_soiree = mysql_query($sql_check_soiree);
				if ($result_check_soiree = mysql_fetch_array($query_check_soiree))
				{
					
					$soiree = 1;
					// on recupere le nombre de pc libres pour cette soirée
					$pc_libres = $result_check_soiree['pc_libres'];
				}
				else
				{
					$soiree = 0;
					$pc_libres = '18';
				}
				
				$pc_res = 18 - $pc_libres;
				
				// on recupere l'id_user de chaque reservation sur la soirée donnée
				$sql_res = 	"SELECT id_res, id_user, nb_pc, username
							FROM calendar_reservation, frm_users
							WHERE id_soiree=".$result_check_soiree['id_soiree']."
							AND calendar_reservation.id_user = frm_users.user_id
							ORDER BY id_res";
				$query_res = mysql_query($sql_res);
				
				// si la requete renvoie quelquechose, on execute la boucle
				if ($query_res)
				{	
					while($result_res = mysql_fetch_array($query_res))
					{	
						for ($a=1; $a<=$result_res['nb_pc']; $a+=1)
						{ 
							if (($a-1) % 6 == 0)
							{
								echo "</tr><tr>";
							} 
							echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"img/pc_res.gif\" width=\"13\" /></td>"; 
						}
					}
					for ($nb_cases=$n;$nb_cases<=18;$nb_cases+=1)
					{ 
						if (($nb_cases-1) % 6 ==0)
						{
							echo "</tr><tr>";
						}
						//construction cellule blanche 
						echo "<td></td>"; 
					}
					
				}
				?>
				</tr>
		</table>
le script sans le for() : http://vanwork.nuxit.net/goodgame/calen ... splay2.php Il ne marche pas très bien, vu qu'il y'a 3 pc reservé par VaN et 5 par RoB dans ma base de données (le script du dessu par contre l'affiche correctement)
<table width="100%"  border="1" align="center">
				<tr>
				<?php
				$date = $current_year."-".$current_month."-".$i;
				$sql_check_soiree = "SELECT id_soiree, date, pc_libres
									FROM  calendar_soiree
									WHERE date='".$date."'";
				$query_check_soiree = mysql_query($sql_check_soiree);
				if ($result_check_soiree = mysql_fetch_array($query_check_soiree))
				{
					
					$soiree = 1;
					// on recupere le nombre de pc libres pour cette soirée
					$pc_libres = $result_check_soiree['pc_libres'];
				}
				else
				{
					$soiree = 0;
					$pc_libres = '18';
				}
				
				$pc_res = 18 - $pc_libres;
				
				// on recupere l'id_user de chaque reservation sur la soirée donnée
				$sql_res = 	"SELECT id_res, id_user, nb_pc, username
							FROM calendar_reservation, frm_users
							WHERE id_soiree=".$result_check_soiree['id_soiree']."
							AND calendar_reservation.id_user = frm_users.user_id
							ORDER BY id_res";
				$query_res = mysql_query($sql_res);
				
				// si la requete renvoie quelquechose, on execute la boucle
				if ($query_res)
				{	
					$n = 1;
					while($result_res = mysql_fetch_array($query_res))
					{	
						//for ($a=1; $a<=$result_res['nb_pc']; $a+=1)
						//{ 
							if (($n/*-1*/) % 6 == 0)
							{
								echo "</tr><tr>";
							} 
							echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"img/pc_res.gif\" width=\"13\" /></td>"; 
						//}
					$n = $n + 1;
					}
					for ($nb_cases=$n;$nb_cases<=18;$nb_cases+=1)
					{ 
						if (($nb_cases-1) % 6 ==0)
						{
							echo "</tr><tr>";
						}
						//construction cellule blanche 
						echo "<td></td>"; 
					}
					
				}
				?>
				</tr>
			</table>

par nicolas » 04 nov. 2005, 15:29

Je pense que tu as un problème de logique. Avant de coder essaie d'écrire sur le papier ce que doit faire ton script!

Ta boucle for à l'intérieur de la boucle while ne sert à rien.
Cela devrait plutôt ressembler à ça:

n = 1
while (liste des enregistrement) {
afficher la cellule.
si n est un multiple de 6 alors
faire une nouvelle ligne
n = n+1
}

par VaN » 04 nov. 2005, 15:25

en fait il suffit juste de se référer à cette image :

http://vanwork.nuxit.net/goodgame/calen ... ndar01.jpg

Ne pas s'occuper de tous les messages d'erreur sur l'image, ce n'est pas important du tout.

Mon code génère le tableau qu'on voit au vendredi 4.
Or, j'aimerais que les cellules rouges soit placées les unes à la suite des autres, jusqu'a atteindre la limite de 6 colonnes, et seulement là, le tableau va à la ligne.

le probleme actuel est lorsque je sors du if(), le tableau inscrit le </tr><tr>, et relance la boucle à partir de $a=1

Enfin, j'imagine que le probleme est la.

par pitt » 04 nov. 2005, 15:18

J'ai relu ton code et ta question et je ne comprend vraiment pas le problème peux tu tenter de reexpliquer Désolé

par VaN » 04 nov. 2005, 15:00

je n'ai toujours pas réussi à trouver comment réaliser ce que je souhaite faire : (

par VaN » 03 nov. 2005, 18:41

j'ai trois tables, construites ainsi :

calendar_reservation
id_res
id_user
id_soiree
date
nb_pc
h_arrivee
h_depart

calendar_soiree
id_soiree
date
pc_libres

frm_users
user_id
user_prenom
user_nom
username
user_password
user_email
user_tel
user_age

par jeff » 03 nov. 2005, 18:31

maintenant que l'on a ton code et tes explication comment est structurer ta base(une modelisation, pas 100lignes)