Conditions similaires

Mammouth du PHP | 985 Messages

24 févr. 2010, 18:50

Bonjour, il y a t-il un moyen de simplifier plusieurs conditions similaires au lieu d'une répétition de mêmes tests sur différentes variables?

Je m'explique, exemple:
if (test($variable1) && test($variable2) && test($variable3))
    echo 'Test réussis';
La fonction test() ici étant la même pour les 3 conditions.
Le but serait de faire un seul et même test pour les 3 variables.
Le but aussi est de simplifier et non de compliquer le code.
Donc l'idée d'utiliser un tableau dans ce cas précis, ne me parait pas intéressante.

Merci, par avance
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 5462 Messages

24 févr. 2010, 18:56

tu pourrais faire un "eval" sur une chaine dynamique (mais perso je suis pas fan du eval)

EDIT: après ca dépend comment son tes données, ce genre de chose se ferais plus avec un tableau et apres genre array_(map|walk|filter) avec ta fonction en paramètre, suffirais de faire ta comparaison

ViPHP
ViPHP | 2287 Messages

24 févr. 2010, 19:52

Hello,

Et pourquoi pas...
if (test($variable1,$variable2,$variable3))
    echo 'Test réussis';
Après, dans ta fonction test(), func_get_args() pour boucler sur les N paramètres, un && en fin de boucle sur les résultats (si >1) et le tour serait joué...
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 985 Messages

25 févr. 2010, 00:37

J'avais cru voir une syntaxe s'approchant de ton exemple Calimero, mais n'utilisant aucune boucle...
J'ai dû rêver.
Sinon oui c'est une bonne idée, sauf que je n'ai pas été assez précis, la fonction n'est pas une fonction personnelle mais c'est la fonction empty().
Au pire je vais utiliser un tableau, car 3 tests à la suite (empty()) ça gêne mon oeil :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
AB
ViPHP | 5818 Messages

25 févr. 2010, 00:52

J'avais cru voir une syntaxe s'approchant de ton exemple Calimero, mais n'utilisant aucune boucle...
J'ai dû rêver.
Sinon oui c'est une bonne idée, sauf que je n'ai pas été assez précis, la fonction n'est pas une fonction personnelle mais c'est la fonction empty().
Au pire je vais utiliser un tableau, car 3 tests à la suite (empty()) ça gêne mon oeil :wink:
Oui enfin même si ca gêne ton oeil, faire un tableau pour vérifier trois variables avec empty ça sera juste plus verbeux (donc tout autant gênant pour les yeux) et accessoirement moins performant.

D'un autre côté ça m'amuse assez, je vois que je ne suis pas le seul frustré de ne pas pouvoir faire empty($var1,$var2,$var3) alors qu'on peut le faire avec isset :lol:

Mammouth du PHP | 985 Messages

25 févr. 2010, 00:56

Voila, t'as tout compris :wink:
Puis voila aussi, c'était avec isset() que l'on pouvait le faire, je me disais bien que javais vue ça quelque part.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 2287 Messages

25 févr. 2010, 01:00

J'avais cru voir une syntaxe s'approchant de ton exemple Calimero, mais n'utilisant aucune boucle...
J'ai dû rêver.
La boucle étant interne à la fonction, pour moi elle est "cachée" de ton source principal. N'était-ce pas l'objectif ?

Si tu es allergique aux boucles (je sais pas trop pourquoi, mais admettons :lol: ) ça pourrait aussi se faire avec un switch à la place de la boucle... :) (et peut-être encore d'autres astuces auxquelles je ne pense même pas).

Mais c'est, à mon goût, pas plus court ni plus joli, et ça impose un maximum de paramètres dans ta fonction (celui que tu auras daigné traiter dans le switch)... Mais bon, pourquoi pas :|

Il doit y avoir des exemples pertinents dans la page de manuel de func_get_args().
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 985 Messages

25 févr. 2010, 01:12

Oui t'as raison:
function multi_empty() {
    foreach(func_get_args() as $args) {
        if (empty($args)) {
            return true;
            break;
        }
    }
    return false;
}
Bien joué, merci, ca fonctionne nickel :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
AB
ViPHP | 5818 Messages

25 févr. 2010, 01:58

Oui t'as raison:
function multi_empty() {
    foreach(func_get_args() as $args) {
        if (empty($args)) {
            return true;
            break;
        }
    }
    return false;
}
Bien joué, merci, ca fonctionne nickel :wink:
Heu ... c'est pas un peu vite dit, "nickel" ? Si tu passes en argument une variable qui n'est pas définie tu vas te prendre une "Notice: Undefined variable", ce qui est moyennement rigoureux.

Par ailleurs le fonctionnement n'est pas identique à if(isset($var1,$var2, $var3)) qui équivaut à if(isset($var1) && isset($var2) && isset($var2)) alors que ta fonction if(multi_empty($var1,$var2,$var3)) équivaut à if(empty($var1) || empty($var2) || empty($var3))
... mais c'est peut être ce que tu souhaites.

Mammouth du PHP | 985 Messages

25 févr. 2010, 03:04

http://palacesec.freehostia.com/php-mail.html

j'initialise les variables avant, elles peuvent ensuite être null, mais le nul aura été défini avant.
Il est vrai que la fonction seule empty() ne renvoie pas d'erreur Notice en cas de variable non définie.
Mais dès que l'on utilise d'autres fonctions, il est disons primordiale de définir ces variables.
Ce point est disons plutôt commun.


Ensuite je fais:
if (!m_empty($nom, $sujet, $message))
Le false étant possible si et seulement si les 3 variables sont false sinon le break stop la boucle et retourne true.

Ensuite, j'ai fais les tests pour être certain , avec des variables null et vides -> c'est pour ceci que je disais que c'était nickel pour ce que je voulais faire.

Sinon, ta remarque est pertinente pour ceux qui voudraient l'utiliser :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
AB
ViPHP | 5818 Messages

25 févr. 2010, 05:22

Ah ok, utilisée comme tu l'utilise, je comprend mieux l'intérêt de ta fonction :)

Cela dit c'est vraiment spécifique et à n'utiliser que dans ce contexte particulier, sinon se souvenir que sur plusieurs variables if(!m_empty($nom, $sujet, $message)) n'est pas strictement l'inverse de if(m_empty($nom, $sujet, $message)). Donc take care, comme ils disent... (les anglais) :)