Comment puis-je utiliser l'opérateur ternaire (?) En PHP comme raccourci pour « if / else »?
-
19-09-2019 - |
Question
D'après les exemples de cette page , j'ai le travail et non -travailler exemples de code ci-dessous.
Code de travail en utilisant la déclaration de if
:
if (!empty($address['street2'])) echo $address['street2'].'<br />';
Code non-travail en utilisant l'opérateur ternaire:
$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
UPDATE
Après la pointe de Brian, je trouve que l'écho $test
affiche le résultat attendu. Les œuvres suivantes comme un charme!
echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
La solution
(condition) ? /* value to return if condition is true */
: /* value to return if condition is false */ ;
syntaxe est pas un « raccourci si » l'opérateur (le ?
est appelé l'opérateur conditionnel) parce que vous ne pouvez pas exécuter le code de la même manière que si vous avez fait:
if (condition) {
/* condition is true, do something like echo */
}
else {
/* condition is false, do something else */
}
Dans votre exemple, vous exécutez l'instruction echo
lorsque le $address
n'est pas vide. Vous ne pouvez pas le faire de la même manière avec l'opérateur conditionnel. Ce que vous pouvez faire cependant, est echo
le résultat de l'opérateur conditionnel:
echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];
et ceci affichera « Street est vide! » si elle est vide, sinon il affichera l'adresse street2.
Autres conseils
PHP 7 +
PHP 7, cette tâche peut être effectuée simplement en utilisant le opérateur nul coalescent comme ceci:
echo !empty($address['street2']) ?? 'Empty';
base Vrai / Faux Déclaration
$is_admin = ($user['permissions'] == 'admin' ? true : false);
Message de bienvenue conditionnel
echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';
Articles conditionnels message
echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';
L'opérateur ternaire est juste un raccourci et si / bloc d'autre. Votre code de travail n'a pas une condition d'autre, donc ne convient pas pour cela.
L'exemple suivant fonctionnera:
echo empty($address['street2']) ? 'empty' : 'not empty';
Il est l'opérateur ternaires a.k.a opérateur Elvis (google: P) que vous recherchez.
echo $address['street2'] ?: 'Empty';
Il renvoie la valeur de la variable ou par défaut si la variable est vide.
Notez que lorsque vous utilisez les opérateurs conditionnels imbriqués, vous voudrez peut-être utiliser des parenthèses pour éviter les problèmes possibles!
Il semble que PHP ne fonctionne pas de la même façon au moins Javascript ou C #.
$score = 15;
$age = 5;
// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));
// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');
Le même code en Javascript et C # retour "exceptionnel" dans les deux cas.
Dans le 2ème cas, ce que PHP est fait (ou du moins ce que je comprends):
- est
$score > 10
? oui - est
$age > 10
? non, de sorte que les rendements de$age > 10 ? 'Average' : 'Exceptional'
actuels exceptionnel ' - puis, au lieu d'arrêter toute la déclaration et le retour « exceptionnel », il continue d'évaluer la déclaration suivante
- l'instruction suivante devient
'Exceptional' ? 'Horrible' : 'Average'
qui retourne 'Horrible', comme 'exceptionnel' est truthy
De la documentation: http://php.net/manual/en/ language.operators.comparison.php
Il est recommandé d'éviter « empiler » les expressions ternaires. PHP de le comportement lors de l'utilisation de plus d'un opérateur ternaire dans un seul déclaration est non évidente.
Message de bienvenue conditionnel
echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';
PHP Nested sténographie
echo 'Your score is: '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );
Vous pouvez le faire en remplaçant echo
avec ce <?= code ?>
encore plus court
<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>
Ceci est particulièrement utile lorsque vous voulez déterminer, à l'intérieur d'une barre de navigation, si l'option de menu doit être affiché comme déjà visité (clic) ou non:
<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>
Voici quelques exemples intéressants, avec une ou plusieurs conditions variées.
$value1 = '1';
$value2 = '2';
$value3 = '3';
// 1 Condition
$v1 = ($value1 == '1') ? TRUE : FALSE;
var_dump($v1);
echo "<br>";
// 2 Conditions
$v2 = ($value1 == '' ? TRUE : ($value2 == '2' ? TRUE : FALSE));
var_dump($v2);
echo "<br>";
// 3 Conditions
$v3 = ($value1 == '' ? TRUE : ($value2 == '' ? TRUE : ($value3 == '3' ? TRUE : FALSE)));
var_dump($v3);
echo "<br>";
// 4 Conditions
$v4 = ($value1 == '1') ? ($value2 == '2' ? ($value3 == '3' ? TRUE : 'FALSE V3') : 'FALSE V2') : 'FALSE V1' ;
var_dump($v4);
echo "<br>";
Je pense que vous avez utilisé les crochets dans le mauvais sens. Essayez ceci:
$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
Je pense que cela devrait fonctionner, vous pouvez également utiliser:
echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
Il y a aussi un opérateur ternaire raccourci et il ressemble à ceci:
(expression1): expression2 retourne expression1 si elle évalue à true ou expression2 sinon
.Exemple:
$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';
renverra
Apples are great!
Depuis PHP 5.3, il est possible de laisser la partie médiane de la opérateur ternaire. Expression Expr1: retourne Expr3 expr1 si expr1 la valeur TRUE et expr3 autrement.