[RESOLU] Je voudrais sortir de la boucle foreach au bon moment

Eléphanteau du PHP | 45 Messages

25 sept. 2011, 13:19

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";
}
}
}
}
?>
Modifié en dernier par Zebu le 25 sept. 2011, 22:12, modifié 1 fois.

Mammouth du PHP | 2278 Messages

25 sept. 2011, 13:50

faudrait regarder du côté de while...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
xTG
ViPHP | 7331 Messages

25 sept. 2011, 13:59

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 ==

Eléphanteau du PHP | 45 Messages

25 sept. 2011, 14:28

Merci pour vos conseils, je vais essayer tout cela et je vous tiens au courant.

Eléphanteau du PHP | 45 Messages

25 sept. 2011, 15:45

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";
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 sept. 2011, 16:48

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.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 45 Messages

25 sept. 2011, 17:19

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";
}
?>

Mammouth du PHP | 2278 Messages

25 sept. 2011, 17:48

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...)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 45 Messages

25 sept. 2011, 19:51

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";
?>

Mammouth du PHP | 2278 Messages

25 sept. 2011, 20:52

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...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 45 Messages

25 sept. 2011, 21:29

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.

Mammouth du PHP | 2278 Messages

25 sept. 2011, 22:05

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";
}
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 45 Messages

25 sept. 2011, 22:36

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);""
Modifié en dernier par Zebu le 26 sept. 2011, 00:20, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 sept. 2011, 23:21

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.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 45 Messages

25 sept. 2011, 23:31

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.