Page 1 sur 2

Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 13:19
par Zebu
Je voudrais sortir de la boucle foreach au bon moment c'est a dire si les valeurs correspondent, et non pas afficher les messages plusieurs fois. C'est à dire si $id=$valeur alors on sort de la boucle et on affiche les messages. Y a t'il une autre solution ?
<?php
include_once 'includes/db.php';
include_once 'includes/session.php';
$id = ($_GET['id']);
    $sqlbuddy = mysql_query("SELECT friends FROM users WHERE uid = '" . $uid . "'") or die (mysql_error());
    while($row = mysql_fetch_array($sqlbuddy))
{
    $friends = unserialize($row["friends"]);
//mysql_free_result ($sqlbuddy);  
mysql_close ();
if (isset ($friends[0]) ) {
foreach($friends as $key => $valeur )
{
     	echo "Clé :" .$key. " Valeur : ".$valeur."<br />\n";

if ($id=$valeur) {

echo "toto";
 } else {
echo "tata";
}
}
}
}
?>

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 13:50
par sirakawa
faudrait regarder du côté de while...

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 13:59
par xTG
C'est en effet tout l'attrait d'une boucle while que de mettre une telle condition.
A noter aussi que pour tester l'égalité ce n'est pas = mais ==

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 14:28
par Zebu
Merci pour vos conseils, je vais essayer tout cela et je vous tiens au courant.

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 15:45
par Zebu
Voila ou j'en suis, je n'arrive pas a créer une boucle while pour sortir de la boucle foreach quand la valeur contrôlé est bonne. quelqu’un à une solution ?
<?php
include_once 'includes/db.php';
include_once 'includes/session.php';
$id = ($_GET['id']);
    $sqlbuddy = mysql_query("SELECT friends FROM users WHERE uid = '" . $id . "'") or die (mysql_error());
    while($row = mysql_fetch_array($sqlbuddy))
{
    $friends = unserialize($row["friends"]);
if (isset ($friends[0]) ) {
foreach($friends as $key => $value )
{
     	echo "Clé :" .$key. " Valeur : ".$value."<br />\n";

if($uid==$value) {

echo "toto";
} else {
	echo "tata";
}
}
}
}
echo "Pas amis";
?>

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 16:48
par Ryle
Si tu utilises une boucle while, les conditions de sorties doivent être placées dans la condition du while :

Code : Tout sélectionner

TANT QUE mes conditions sont respectées on boucle FIN TANT QUE
Ta condition étant "tant qu'il y a des valeurs ET tant que les ids ne sont pas identiques".

Ceci étant pour sortir d'une boucle sans poursuivre l'exécution jusqu'au bout, il suffit d'utiliser l'instruction "break" pour interrompre l'exécution et sortir de la boucle.

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 17:19
par Zebu
As tu un exemple de code à me donner à me donner ? je ne m'en sort pas avec les boucles WHILE.
<?php
include_once 'includes/db.php';
include_once 'includes/session.php';
$id = ($_GET['id']);
    $sqlbuddy = mysql_query("SELECT friends FROM users WHERE uid = '" . $id . "'") or die (mysql_error());
    while($row = mysql_fetch_array($sqlbuddy))
{
$friends = unserialize($row["friends"]);
if (isset ($friends[0]) ) {
foreach($friends as $key => $value )
{

if($uid==$value) {

echo "amis";
}
}
}
echo "pas amis";
}
?>

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 17:48
par sirakawa
Imaginons qu'on part de rien:
quand ta boucle future est terminée, qu'est-ce qui est vrai ?
quand $id == $valeur (condition de sortie)
par conséquent la condition de continuation du while, et non pas de sortie comme dit la majorité de la littérature) est le contraire:(1)

while ($id != $valeur)
{

}
mais pour que ça fonctionne il faut avoir une valeur pour $valeur avant le while:
ça donne en finale un truc qui ressemble à ça:
<?PHP
$friends = array("toto", "titi", "fantomas", "diabolus");
$valeur =$friends[0];
$id = "fantomas";
while ($id != $valeur)
{
    $valeur = next ($friends);
}
print "$valeur";
?>
qui va se planter avec allégresse si on cherche un $id inexistant: création d'une boucle infinie et temps alloué dépassé très normalement.
D'où, plus rigoureux et plus sûr:
<?PHP
$friends = array("toto", "titi", "fantomas", "diabolus");
$valeur =$friends[0];
$id = "fantomas";
$trouve = ($valeur == $id);
while ((!$trouve) and ($valeur = next ($friends)))
{
    $trouve = ($valeur == $id);
}
if ($trouve)
{
     print "$valeur";
}
else
{
	print "absent";
}
?>
(1) Il est souvent plus simple, surtout quand les conditions sont compliquées, de partir de la situation finale souhaitée, et d'en déduire le contraire qui est la condition de continuation du while, en appliquant la loi de De Morgan appliquée couramment par les spécialistes des automatismes:
NON (A et B) <==> (Non A ou Non B)
NOn (A ou B) <==> (Non A et Non B)
plus simple à comprendre et à appliquer si l'expression est complètement paranthésée...
Au passage, il faut réserver break aux switch. Il faut toujours avoir un seul point de sortie d'une boucle. (cf Knuth, Dijkstra and alii...)

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 19:51
par Zebu
Je ne m'en sort pas avec ces while. Ce programme fonctionne sans erreurs mais je n'arrive pas a afficher la valeur "$value" il m'affiche directement "absent" si la condition est remplie, ou il ne m'afficher rien car le programme s'est terminé. je voudrais pouvoir afficher "($value)" quand si if(trouve).
<?php
include_once 'includes/db.php';
include_once 'includes/session.php';
$id = ($_GET['id']);
    $sqlbuddy = mysql_query("SELECT friends FROM users WHERE uid = '" . $id . "'") or die (mysql_error());
    while($row = mysql_fetch_array($sqlbuddy))
{
$friends = unserialize($row["friends"]);
if (isset ($friends[0]) ) {
foreach($friends as $key => $value )
{
$value = $friends[0];
$trouve = ($value == $id);
}
while ((!$trouve) and ($value = next ($friends)))
{
    $trouve = ($value == $id);
}
if ($trouve)
{
     print "$value";
}
else
{
        print "absent";
}

}
//echo "inexistant";
}
//echo "pas d'amis";
?>

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 20:52
par sirakawa
Je n'avais pas pensé à une question toute simple :
uid est-il unique dans la table comme ceci:
toto|1
titi|2
ou multiple comme ceci:
toto|1
titi|1
ruskof|2
tarara|3
tartre|3
Parce que s'il est unique, le script se réduit à peu de choses...
J'ai tout simulé en supposant qu'il est multiple... mais j'attends confirmation pour continuer à corriger les Hénaurmités qui trainent dans ton code...

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 21:29
par Zebu
En effet uid est un identifiant unique dans la table avec incrémentation de 1 à chaque nouveau utilisateurs.
comme :
toto|1
titi|2
tata|3
Pendant ce temps je continu à travailler sur le script. Je vais corriger les énormités que j'ai faite tout à l'heure, je n'avais pas le temps de travailler.

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 22:05
par sirakawa
Ecuse-moi pour le ton, mais si uid est unique, il n'y a pas besoin de t'entiquiner:
soit ta requere rend un resultat car id = uid soit non*alors tu fais ça en plusieurs fois ( c'est une de mes manies)
$requete = "ta requete";
$resultat = mysql_query($requete);

if ($resultat)
{
$row = mysql_fetch_row($resultat);
}
else
{
$message = inconnu";
}

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 22:36
par Zebu
Tu ne m'as pas montrer le même exemple et en désérialsant les données comme mon code inspire, exemple:
$friends = unserialize($row["friends"]);
reprend mon dernier code. Ecris moi un code complet.
Ton code ne fonctionne pas voila l’erreur:
"Warning: mysql_query() expects parameter 1 to be string, resource given in C:\...on line 2 qui correspond à "$resultat = mysql_query($requete);""

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 23:21
par moogli
Si tu veux un code complet y a un forum complet.

Ton message d'erreur indique que tu passe, en paramètre de mysql_query() une ressource. C'est a dire le retour d'un mysql_query ou d'un fopen etc, alors qu'il faut que ce soit une chaîne de caractères.

Utilise la fonction var_dump sur la variable requête pour voir ce que c'est. Ensuite remonte dans ton code pour voir d'où ça sort.

@+

Re: Je voudrais sortir de la boucle foreach au bon moment

Posté : 25 sept. 2011, 23:31
par Zebu
Je sais d’où ça viens, ça viens des données qu'on essais de lire a lors qu'elle ne sont pas desérialisées. c'est pour ca que j'ai demander un exemple avec données désérialisées.