Comment utiliser l'opérateur ternaire (?:) En PHP comme raccourci pour «if / else»?

118

Sur la base des exemples de cette page , j'ai les exemples de code fonctionnel et non fonctionnel ci-dessous.

Code de travail utilisant l' ifinstruction:

if (!empty($address['street2'])) echo $address['street2'].'<br />';

Code non fonctionnel utilisant l'opérateur ternaire:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

MISE À JOUR
Après le conseil de Brian, j'ai trouvé que l'écho $testproduisait le résultat attendu. Ce qui suit fonctionne comme un charme!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
Steven
la source
4
Cela semble correct. Avez-vous essayé d'écho $ test ;?
Brian Fisher
Votre question trompe certains volontaires et chercheurs parce que vous n'écrivez pas un devoir en utilisant une expression ternaire abrégée (il n'y a pas d '«opérateur Elvis») - vous écrivez une expression ternaire longue. La différence est que vous déclarez les deux valeurs renvoyées en fonction de l'évaluation. Dans une évaluation abrégée, si la valeur d'entrée est "véridique", elle est renvoyée; s'il est "falsey" alors la valeur de repli est retournée (c'est la valeur déclarée après l'opérateur Elvis). Il y a aussi une mise en œuvre sensiblement médiocre de l'opérateur de coalescence Null ici aussi.
mickmackusa le

Réponses:

234

le

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

La syntaxe n'est pas un opérateur "raccourci si" (on l' ?appelle l'opérateur conditionnel) car vous ne pouvez pas exécuter de code de la même manière que si vous l'aviez fait:

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

Dans votre exemple, vous exécutez l' echoinstruction lorsque le $addressn'est pas vide. Vous ne pouvez pas faire cela de la même manière avec l'opérateur conditionnel. Ce que vous pouvez faire cependant, c'est echole résultat de l'opérateur conditionnel:

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

et cela affichera "La rue est vide!" s'il est vide, sinon il affichera l'adresse street2.

John Rasch
la source
C'est la différence entre la déclaration et l'expression
pmiranda
2
quelle est encore la sténographie? condition ?: falsequi évalue conditionsi c'est vrai?
oldboy le
44

PHP 7+

Depuis PHP 7, cette tâche peut être effectuée simplement en utilisant l' opérateur de fusion Null comme ceci:

echo !empty($address['street2']) ?? 'Empty';

Rabin Lama Dong
la source
3
Juste pour info, si $address['street2']est une chaîne vide. Il l'acceptera et ne reviendra pas 'Empty'. isset() != empty(). Cela ne fonctionnera que si la valeur estnull
AFwcxx
Eh bien, je ne faisais que donner un exemple. Mais j'ai modifié le code. Merci !
Rabin Lama Dong
2
Quelle est la sortie si elle $address['street2']n'est pas vide?
AliN11
Si $ address ['street2'] n'est pas vide, il affichera une forme de «vrai». La forme habituelle de ce qui précède est plus semblable: echo $address['street2'] ?? 'Empty';cependant, comme mentionné, il s'agit de « l' opérateur de fusion nul », donc il ne teste que null et non vide. Ceci est dû au fait ?? Est en fait un raccourci pour isset ().
Brian C
1
Connecté juste pour voter contre cette réponse. Cela ne fait pas du tout ce qui est annoncé.
TKoL
28

Déclaration de base vrai / faux

$is_admin = ($user['permissions'] == 'admin' ? true : false);

Message de bienvenue conditionnel

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

Message des éléments conditionnels

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

réf: https://davidwalsh.name/php-ternary-examples

Arun Yokesh
la source
2
vous l'avez obtenu sur le site Web abrégé et ne l'avez même pas référencé
Richard
1
@Richard a ajouté des références
Arun Yokesh
C'est ça? Dans le contexte de StackOverflow, c'est toujours une ligne mince, je veux dire que le Q a demandé quelque chose, incapable de le trouver par lui-même, puis quelqu'un d'autre a livré ce contenu. Est-il injuste de copier du contenu existant si cela aide et ajoute de la valeur à ce Q / R? Je pense que les réponses sur StackOverflow ne sont pas "votre propre contenu" ... hmmm
Sliq
Le premier exemple est incorrect. Le )est mal placé. Il doit précéder le ?. La déclaration complète devrait être$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286 le
12

L'opérateur ternaire est juste un raccourci pour et if / else bloc. Votre code de travail n'a pas de condition else, il n'est donc pas adapté à cela.

L'exemple suivant fonctionnera:

echo empty($address['street2']) ? 'empty' : 'not empty';
Adrianbanks
la source
6

C'est l'opérateur Ternary aka l'opérateur Elvis (google it: P) que vous recherchez.

echo $address['street2'] ?: 'Empty'; 

Il renvoie la valeur de la variable ou par défaut si la variable est vide.

Clavier ninja
la source
@Struced Je ne peux pas être en désaccord avec ce que vous dites mais, googler pour cela vous donnera le bon résultat et c'est un terme plus facile à rappeler
Keyboard ninja
4

Notez que lorsque vous utilisez des opérateurs conditionnels imbriqués, vous pouvez utiliser des parenthèses pour éviter d'éventuels problèmes!

Il semble que PHP ne fonctionne pas de la même manière qu'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 # renvoie "Exceptionnel" dans les deux cas.

Dans le 2ème cas, ce que fait PHP (ou du moins c'est ce que je comprends):

  1. est $score > 10 ? Oui
  2. est $age > 10? non, donc le courant$age > 10 ? 'Average' : 'Exceptional' renvoie 'Exceptionnel'
  3. puis, au lieu d'arrêter simplement l'instruction entière et de renvoyer 'Exceptionnel', il continue d'évaluer l'instruction suivante
  4. la déclaration suivante devient 'Exceptional' ? 'Horrible' : 'Average'qui renvoie `` Horrible '', car `` Exceptionnel '' est la vérité

Depuis la documentation: http://php.net/manual/en/language.operators.comparison.php

Il est recommandé d'éviter "d'empiler" les expressions ternaires. Le comportement de PHP lors de l'utilisation de plus d'un opérateur ternaire dans une seule instruction n'est pas évident.

utilisateur276648
la source
3

Voie rapide et courte:

echo $address['street2'] ? : "No";

Voici quelques exemples intéressants, avec une ou plusieurs conditions variées.

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";
Apprentissage et partage
la source
2

Message de bienvenue conditionnel

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

Raccourci PHP imbriqué

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );
Adnan
la source
2

Vous pouvez le faire encore plus court en le remplaçant echopar<?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

Ceci est particulièrement utile lorsque vous souhaitez déterminer, à l'intérieur d'une barre de navigation, si l'option de menu doit être affichée comme déjà visitée (cliquée) ou non:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>

Pathros
la source
Les () sont-ils nécessaires dans cette méthode <? =?>?
boucles du
0

Je pense que vous avez mal utilisé les parenthèses. Essaye ça:

$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 />');
user2909855
la source
0

Je pense que vous ne devriez probablement pas utiliser d'opérateur ternaire en php. Prenons l'exemple suivant:

<?php

function f1($n) {
    var_dump("first funct");
    return $n == 1;
}

function f2($n) {
    var_dump("second funct");
    return $n == 2;
}


$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);

Comment pensez-vous, quelle $avariable contiendra? (indice: dos) Et cela restera le même même si la $foovariable sera assignée à 2.

Pour améliorer les choses, vous devez soit refuser d'utiliser cet opérateur, soit entourer la partie droite avec des accolades de la manière suivante:

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");
rela589n
la source
0

L'opérateur ternaire est essentiellement un raccourci pour l'instruction if / else. Nous pouvons utiliser pour réduire quelques lignes de code et augmenter la lisibilité.

Votre code me paraît plus propre. Mais nous pouvons ajouter une manière plus propre comme suit-

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

Autrement-

$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');

Remarque - J'ai ajouté un crochet à toute l'expression pour la rendre plus propre. J'avais l'habitude de faire cela pour augmenter la lisibilité. Avec PHP7, nous pouvons utiliser Null Coalescing Operator / php 7 ?? opérateur pour une meilleure approche. Mais votre exigence ne correspond pas.

Exception
la source
-1

Il y a aussi un opérateur ternaire abrégé et il ressemble à ceci:

(expression1)?: expression2 renverra expression1 si elle est évaluée à vrai ou expression2 cas contraire.

Exemple:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

reviendra

Apples are great!

Depuis PHP 5.3, il est possible d'omettre la partie médiane de l'opérateur ternaire. Expression expr1?: Expr3 renvoie expr1 si expr1 vaut TRUE, et expr3 sinon.

À partir du manuel PHP

horas_ro
la source