web-dev-qa-db-fra.com

Comment utiliser l'opérateur ternaire (?:) Dans PHP comme raccourci pour "if / else"?

Basé sur les exemples à partir de cette page , j'ai les exemples de code de travail et de non-travail ci-dessous.

Code de travail utilisant l'instruction if:

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

Code non fonctionnel utilisant un opérateur ternaire:

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

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

[~ # ~] met à jour [~ # ~]
Après le conseil de Brian, j'ai constaté que l'écho de $test Donnait le résultat attendu. Ce qui suit fonctionne comme un charme!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
96
Steven

Le

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

la syntaxe n'est pas un opérateur "sténo si" (le ? est appelé l'opérateur conditionnel) car vous ne pouvez pas exécuter de code de la même manière que si vous le faisiez:

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 la commande $address n'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 echo le résultat de l'opérateur conditionnel:

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

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

194
John Rasch

PHP 7+

A partir de PHP 7, cette tâche peut être effectuée simplement en utilisant le opérateur de coalescence nul comme ceci:

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

37
Rabin Lama Dong

Déclaration de base vraie/fausse

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

Message de bienvenue conditionnel

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

Message d'éléments conditionnels

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

L'opérateur ternaire n'est qu'un raccourci pour le bloc et si/autre. Votre code de travail n'a pas d'autre condition, donc ne convient pas pour cela.

L'exemple suivant fonctionnera:

echo empty($address['street2']) ? 'empty' : 'not empty';
11
adrianbanks

C'est l'opérateur ternaire a.k.a Elvis (google it: P) que vous recherchez.

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

Il retourne la valeur de la variable ou default si la variable est vide.

4
Keyboard ninja

Notez que lorsque vous utilisez des opérateurs conditionnels imbriqués, vous pouvez utiliser des parenthèses pour éviter tout problème éventuel!

Cela ressemble à PHP ne fonctionne pas de la même façon 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 en C # renvoie "Exceptionnel" dans les deux cas.

Dans le second cas, ce que PHP fait est (ou du moins c'est ce que j'ai compris):

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

De 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 plusieurs opérateurs ternaires dans une même instruction n'est pas évident.

3
user276648

Vous pouvez le faire encore plus rapidement en remplaçant echo par <?= code ?>

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

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

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

2
Pathros

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>";
2

Message de bienvenue conditionnel

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

imbriqué PHP sténographie

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

Je pense que vous avez utilisé les crochets dans le mauvais sens. Essaye ça:

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

Je pense que ça devrait marcher, vous pouvez aussi utiliser:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
0
user2909855