2009-07-16 10 views
5

Je souhaite définir une variable sur une valeur, mais uniquement si une condition est vraie.
Au lieu de faire ce qui suit:Opérateur conditionnel avec uniquement une instruction vraie

if($myarray["foo"]==$bar){ 
    $variablename=$myarray["foo"]; 
} 

Cela peut finir par être assez long si les noms de variables sont longues, ou peut-être il implique des tableaux, quand il est assez simple ce que je veux faire — définir une valeur si une la condition est vraie.

Je voudrais utiliser l'opérateur conditionnel, quelque chose comme ceci:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"]...... 

Mais cela ne fonctionne pas parce que je ne suis pas la variable doit être fixé à tout si la déclaration est fausse.

Fondamentalement, ce que j'essaie de faire est de raccourcir le premier exemple. Peut-être que l'opérateur conditionnel n'est pas le moyen ...

Quelqu'un a-t-il des suggestions?

+0

Votre deuxième exemple de code n'est pas vraiment plus court que le premier (si vous supprimez les sauts de ligne et les accolades dans le premier). Vous faites toujours référence au tableau deux fois ... qu'attendez-vous exactement de cela? –

Répondre

-1

Définissez la variable à lui-même dans le faux cas:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"] : $variablename 
+1

Pourquoi le downvot? ceci est parfaitement valide – Draemon

+0

dunno, j'en ai un aussi pour le même code. – jjnguy

+0

Ce n'est pas valide, il y a de fortes chances que cela génère un avis. –

7

OMI, la meilleure façon de rendre votre exemple de code plus court est:

if($myarray["foo"] == $bar) 
    $variablename = $myarray["foo"]; 

Pour votre information, le nom de l'opérateur que vous » re demandant à propos de n'est pas "l'opérateur ternaire", c'est the conditional operator.

Puisque vous demandez, une façon que vous pouvez réellement utiliser l'opérateur conditionnel de faire ce que vous demandez est:

$myarray['foo'] == $bar ? $variablename = $myarray['foo'] : null; 

mais qui est un peu moche et horriblement très difficile à maintenir.

+3

Je pense qu'il est plus sûr de toujours utiliser des accolades. –

+7

Je voulais juste faire remarquer, il est en fait appelé l'opérateur ternaire http://ca.php.net/ternary#language.operators.comparison.ternary – Evert

+0

Pfaugh. Montre ce que Zend sait. – chaos

1

Votre droite, ternaire n'est pas la voie à suivre. Il est là pour gérer la partie if et else de la déclaration.

Tenez-vous simplement avec l'instruction if régulière.

if($myarray["foo"]==$bar) $variablename=$myarray["foo"]; 
0

Vous pouvez mettre l'expression originale dans la partie else de l'opération ternaire, mais si vous voulez garantir seule évaluation de l'expression, vous devrez utiliser une variable temporaire et une déclaration if.

7

Il ne va pas beaucoup plus courte que:

if($condition) $var = $value; 
0

ternaires est pas le chemin, même si elle peut être écrit de telle sorte que les œuvres ternaires. La raison est la suivante: vous essayez de l'utiliser d'une manière qui n'est pas prévue, ce qui rend votre code difficile à lire pour les autres développeurs.

3

Vous pouvez le faire, mais je ne car il est assez illisible et stupide:

$myarray["foo"] == $bar ? $variablename = $myarray["foo"] : 0; 

ou

$myarray["foo"] == $bar && $variablename = $myarray["foo"]; 
2

Le « problème » que vous avez est pas vraiment un problème. Votre code d'exemple est très clair et maintenable. Je dirais vraiment que c'est comme ça.

Vous pouvez enlever les accolades, mais cela aura un impact sur la maintenabilité.

Votre autre alternative consiste à créer une fonction wrapper set_if_true (tableau mixte, clé de chaîne, condition booléenne). Il cache ce qui se passe réellement mais selon votre implémentation spécifique c'est une bonne option. (Par exemple, un objet de type de configuration, ou back-end de mise en cache)

+0

D'accord. J'ajouterai que vous (ou d'autres) pourriez vouloir consulter une norme de codage pour tout projet avec lequel vous pourriez travailler. Par exemple, les états Drupal "Toujours utiliser des accolades même dans des situations où ils sont techniquement facultatifs.Les avoir augmente la lisibilité et diminue la probabilité d'erreurs logiques introduites lorsque de nouvelles lignes sont ajoutées." [ref] (https://drupal.org/coding-standards) – cdmo

0

Mettre != au lieu de == et ?: au lieu de simplement ?..

$variablename = ($myarray["foo"] != "bar") ?: $myarray["foo"]; 

est le même que

if($myarray["foo"] != "bar"){} else { $variablename = $myarray["foo"]; } 

Il pourrait ne pas être solution la plus intelligente, mais cela fonctionne. Je l'aime encore plus

if($myarray["foo"] != "bar") {$variablename = $myarray["foo"]}; 
Questions connexes