Come uso l’operatore ternario (?:) In PHP come una scorciatoia per “if / else”?

Sulla base degli esempi di questa pagina , ho qui sotto esempi di codice funzionante e non funzionante.

Codice di lavoro using if statement:

 if (!empty($address['street2'])) echo $address['street2'].'
';

Codice non funzionante usando l’operatore ternario:

 $test = (empty($address['street2'])) ? 'Yes 
' : 'No
'; // Also tested this (empty($address['street2'])) ? 'Yes
' : 'No
';

AGGIORNARE
Dopo il suggerimento di Brian, ho scoperto che echo $test restituisce il risultato atteso. Il seguente funziona come un fascino!

 echo (empty($storeData['street2'])) ? 'Yes 
' : 'No
';

Il

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

la syntax non è un operatore di “stenografia” (il ? è chiamato operatore condizionale) perché non è ansible eseguire il codice nello stesso modo in cui lo si faceva:

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

Nel tuo esempio, stai eseguendo l’istruzione echo quando l’ $address non è vuoto. Non è ansible farlo allo stesso modo con l’operatore condizionale. Tuttavia, ciò che puoi fare è echo il risultato dell’operatore condizionale:

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

e questo mostrerà “Street is empty!” se è vuoto, altrimenti visualizzerà l’indirizzo street2.

Dichiarazione Vero / Falso di base

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

Messaggio di benvenuto condizionale

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

Messaggio di elementi condizionali

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

PHP 7+

A partire da PHP 7, questo compito può essere eseguito semplicemente utilizzando l’ operatore Null coalescing in questo modo:

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

L’operatore ternario è solo una scorciatoia per e se / else blocca. Il tuo codice di lavoro non ha un’altra condizione, quindi non è adatto a questo.

Il seguente esempio funzionerà:

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

Si noti che quando si utilizzano operatori condizionali nidificati, è ansible utilizzare le parentesi per evitare possibili problemi!

Sembra che PHP non funzioni allo stesso modo di almeno Javascript o 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'); 

Lo stesso codice in Javascript e C # restituiscono “Eccezionale” in entrambi i casi.

Nel secondo caso, ciò che PHP fa è (o almeno questo è quello che capisco):

  1. è $score > 10 ? sì
  2. è $age > 10 ? no, quindi l’attuale $age > 10 ? 'Average' : 'Exceptional' $age > 10 ? 'Average' : 'Exceptional' restituisce ‘Eccezionale’
  3. quindi, invece di interrompere l’intera istruzione e restituire “Eccezionale”, continua a valutare la prossima affermazione
  4. la prossima affermazione diventa 'Exceptional' ? 'Horrible' : 'Average' 'Exceptional' ? 'Horrible' : 'Average' che restituisce ‘Orribile’, come ‘Eccezionale’ è la verità

Dalla documentazione: http://php.net/manual/en/language.operators.comparison.php

Si raccomanda di evitare di “impilare” espressioni ternarie. Il comportamento di PHP quando si utilizza più di un operatore ternario all’interno di una singola istruzione non è ovvio.

Messaggio di benvenuto condizionale

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

Stenografia PHP annidata

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

Puoi farlo anche più breve sostituendo l’ echo per

' : 'No
'?>

Questo è utile specialmente quando vuoi determinare, all’interno di una barra di navigazione, se l’opzione di menu debba essere visualizzata come già visitata (cliccata) o meno:

>Home

Penso che tu abbia usato le parentesi nel modo sbagliato. Prova questo:

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

Penso che dovrebbe funzionare, puoi anche usare:

 echo (empty($address['street2']) ? 'Yes 
' : 'No
');

Ecco altri esempi che puoi usare nei tuoi progetti, se hai qualche domanda.

 $value1 = '1'; $value2 = '2'; $value3 = '3'; // 1 Condition $v1 = ($value1 == '1') ? TRUE : FALSE; var_dump($v1); echo "
"; // 2 Conditions $v2 = ($value1 == '' ? TRUE : ($value2 == '2' ? TRUE : FALSE)); var_dump($v2); echo "
"; // 3 Conditions $v3 = ($value1 == '' ? TRUE : ($value2 == '' ? TRUE : ($value3 == '3' ? TRUE : FALSE))); var_dump($v3); echo "
"; // 4 Conditions $v4 = ($value1 == '1') ? ($value2 == '2' ? ($value3 == '3' ? TRUE : 'FALSE V3') : 'FALSE V2') : 'FALSE V1' ; var_dump($v4); echo "
";

C’è anche un operatore ternario stenografico e sembra questo:

(espressione1)?: espressione2 restituirà espressione1 se restituisce true o expression2 in caso contrario.

Esempio:

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

sarà di ritorno

 Apples are great! 

Dal PHP 5.3, è ansible tralasciare la parte centrale dell’operatore ternario. Espressione expr1?: Expr3 restituisce expr1 se expr1 restituisce TRUE ed expr3 in caso contrario.

Dal manuale PHP