Foreach{} else{} - Une mannière de le faire ?

ViPHP
ViPHP | 656 Messages

06 juil. 2006, 06:50

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.

Mammouth du PHP | 19672 Messages

06 juil. 2006, 07:39

Fais un count() sur ton tableau avant le foreach et n'exécute ce dernier que si le résultat est supérieur à 0.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 656 Messages

06 juil. 2006, 07:56

Mmh, je peux pas :cry: sinon je fais 2 fois la requete SQL.

Il doit bien y avoir un autre moyen nan ?

Mammouth du PHP | 505 Messages

06 juil. 2006, 07:59

$flag = true;
foreach(blabla) {
$flag = false;
Je traite ma_ligne
}

if(flag) {
J'indique qu'il n'y a pas de résultats
}

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

06 juil. 2006, 09:26

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";
}
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
ViPHP | 656 Messages

08 juil. 2006, 11:40

12 lignes de code contre 4 :-s

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?

Mammouth du PHP | 983 Messages

08 juil. 2006, 12:31

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.

ViPHP
ViPHP | 656 Messages

09 juil. 2006, 08:48

Un code propre et simple... c'est ma mannière de faire.

Mammouth du PHP | 19672 Messages

09 juil. 2006, 08:56

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é :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 983 Messages

09 juil. 2006, 12:34

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é.

Mammouth du PHP | 19672 Messages

09 juil. 2006, 12:52

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 983 Messages

09 juil. 2006, 13:09

Oui exact? Au temps pour moi.
Il suffirait de définir une valeur dans $nouvelle_variable ( 1 par exemple).

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

10 juil. 2006, 11:18

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 :)