Page 1 sur 1
Foreach{} else{} - Une mannière de le faire ?
Posté : 06 juil. 2006, 06:50
par Ultiny
Bonjour,
J'ai une question pour vous chers amis du PHP,
Je voudrais réaliser un else sur mon foreach au cas ou aucun tour dans le foreach ne serait executé (dans le cas d'un tableau donnée en entrée sans aucune valeur).
Ma ressource est un tableau associatif image d'une réponse SQL, composée de lignes, puis de champs dans ces lignes :
row[0][id] = 1
row[0][name] = Romain
row[1][id] = 1
row[1][name] = Adrien
Je voudrais simplement, dans le cas d'aucune valeur retournée par ma fonction SQL $db->my_exec() ( équivalent à un array() ) pouvoir afficher un message du type 'Aucun résultat'.
La méthode revée serait :
foreach (mon_resultat as ma_ligne)
{
Je traite ma_ligne
}
else
{
J'indique qu'il n'y a pas de résultats
}
Merci pour votre aide.
PS, je ne peux pas toucher à la source, elle vient de ma classe $db->my_exec() et je ne peux y refaire appel pour ne pas relancer une requete.
Ma methode me permets d'avoir juste cette ligne quand j'ai besoin d'une requete :
foreach ($db->my_exec('nom_de_la_requete_sql') as $row)
{
echo('Je suis '.$row['name']);
}
Les requetes sont centralisées dans un fichier.
Posté : 06 juil. 2006, 07:39
par Cyrano
Fais un count() sur ton tableau avant le foreach et n'exécute ce dernier que si le résultat est supérieur à 0.
Posté : 06 juil. 2006, 07:56
par Ultiny
Mmh, je peux pas

sinon je fais 2 fois la requete SQL.
Il doit bien y avoir un autre moyen nan ?
Posté : 06 juil. 2006, 07:59
par titerm
$flag = true;
foreach(blabla) {
$flag = false;
Je traite ma_ligne
}
if(flag) {
J'indique qu'il n'y a pas de résultats
}
Posté : 06 juil. 2006, 09:26
par sadeq
Ta méthode est une fonction qui retourne un tableau, et comme a déjà dit
Cyrano il faut se baser sur le nombre de lignes du tableau résultat pour faire le foreach ou envoyer le message.
Pour ce faire, il faut exécuter ta requête avant de faire le foreach :
//mon tableau résultat
$resultat = $db->my_exec('nom_de_la_requete_sql');
//traiter le résultat s'il y a des lignes
if (count($resultat)>0)
{
//Lire le résultat
foreach ( $resultat as $row )
{
echo "Je suis $row[name]";
}
}
else
{
//message
echo "Le résultat est vide";
}
Posté : 08 juil. 2006, 11:40
par Ultiny
12 lignes de code contre 4
Je n'ai pas envie de mettre mon appel de method dans une variable de plus.
Je pensais soit décortiquer le foreach avec un while et list... ou utiliser un try catch.
Peut-être y'a t-il mieu?
Posté : 08 juil. 2006, 12:31
par rami
Je ne vois pas ce qui gêne d'avoir quelques lignes en plus. Si pour gagner, quelques lignes, tu dois faire des bidouilles, je ne vois vraiment pas l'intérêt.
Posté : 09 juil. 2006, 08:48
par Ultiny
Un code propre et simple... c'est ma mannière de faire.
Posté : 09 juil. 2006, 08:56
par Cyrano
Un code propre et simple... c'est ma mannière de faire.
Je me demande dans cette optique ce qu'on pourrait bien reprocher à l'exemple montré par
Sadeq : ok il a 12 lignes, et alors ? C'est clair, sans fioritures et d'une simplicité extrême. Est-ce que ce n'est pas le but recherché.
Je crois que s'il convient effectivement d'éviter les lignes inutiles, il ne faut pas non plus tout sacrifier pour réduire la longueur et il me semble important de faire un compromis entre longueur et simplicité

Posté : 09 juil. 2006, 12:34
par rami
Un code propre et simple... c'est ma mannière de faire.
Un code
propre signifie justement ne pas employer de "bidouille".
Autrement, un code pas très propre qui te permettrait de limiter le nombre de lignes :
//mon tableau résultat
$resultat = $db->my_exec('nom_de_la_requete_sql');
//Lire le résultat
foreach ((array) $resultat as $row )
{
$nouvelle_variable = null;
echo "Je suis $row[name]";
}
if(!isset($nouvelle_variable))
{
//message
echo "Le résultat est vide";
}
Premièremenent, on caste $resultat pour ne pas avoir d'erreur si la requête n'a rien retourné. Ensuite, dans la boucle on initialise une nouvelle variable. Donc si après la boucle, la variable n'existe pas, c'est qu'aucun résultat n'a été retourné.
Posté : 09 juil. 2006, 12:52
par Cyrano
Hum hum... si tu initialises comme ceci:
$nouvelle_variable = null;
Le if qui suit sera toujours exécuté.
Pour que ton truc fonctionne, il faudra soit rajouter une ligne avant la boucle donnant une valeur non nulle à ta variable et dans ce cas elle sera annulée si on rentre dans la boucle, ou alors, dans la boucle, il faudrait donner une valeur non nulle à cette même variable directement.
Posté : 09 juil. 2006, 13:09
par rami
Oui exact? Au temps pour moi.
Il suffirait de définir une valeur dans $nouvelle_variable ( 1 par exemple).
Posté : 10 juil. 2006, 11:18
par Ryle
La solution de titerm qui proposait également un flag semble être passée innaperçue, elle revient au même et me semble plus propre au niveau de la déclaration du flag
Pour le code "propre et simple" cela n'a rien à voir avec le nombre de lignes. On peut te faire tenir celui de sadeq (qui est non seulement propre mais en plus rigoureux puisqu'il ne rentre pas dans le foreach s'il n'a pas de tableau) en une seule ligne
Et sans aller jusque là, si tu mets les acolades en bout de lignes, il n'en fait que 9. J'espère tout de même que tu n'es pas à 5 lignes et une variable près
Un code "propre et simple" doit pouvoir être facilement compris par d'autres et à mon avis c'est pas en tassant tout sur quelques lignes que l'on peut obtenir un tel résultat
rami >> tiens, ça fait plaisir des gens qui connaissent la différence entre au temps et autant 