Come si usa l'operatore ternario (?) In PHP come abbreviazione per “if / else”?
-
19-09-2019 - |
Domanda
In base agli esempi da questa pagina , ho il lavoro e non -Lavorare esempi di codice di seguito.
codice di lavoro istruzione using if
:
if (!empty($address['street2'])) echo $address['street2'].'<br />';
codice non lavoro con operatore ternario:
$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
Aggiorna
Dopo la punta di Brian, ho scoperto che facendo eco $test
emette il risultato atteso. Le seguenti funziona come un fascino!
echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
Soluzione
Il
(condition) ? /* value to return if condition is true */
: /* value to return if condition is false */ ;
la sintassi non è una "scorciatoia se" operatore (il ?
si chiama l'operatore condizionale) perché non è possibile eseguire il codice nella stessa maniera come se hai fatto:
if (condition) {
/* condition is true, do something like echo */
}
else {
/* condition is false, do something else */
}
Nel tuo esempio, si sta eseguendo la dichiarazione echo
quando il $address
non è vuota. Non si può fare questo allo stesso modo con l'operatore condizionale. Cosa si può fare comunque, è echo
il risultato dell'operatore condizionale:
echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];
e questo verrà visualizzato "Street è vuoto!" se è vuoto, altrimenti si visualizza l'indirizzo street2.
Altri suggerimenti
PHP + 7
Dalla versione 7, questa operazione può essere eseguita semplicemente utilizzando il operatore null coalescenza in questo modo:
echo !empty($address['street2']) ?? 'Empty';
Basic Vero / Falso Dichiarazione
$is_admin = ($user['permissions'] == 'admin' ? true : false);
condizionale messaggio di benvenuto
echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';
Elementi condizionali Messaggio
echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';
L'operatore ternario è solo una scorciatoia per se e / blocco else. Il tuo codice di lavoro non ha una condizione di altro, quindi non è adatto per questo.
Il seguente esempio funziona:
echo empty($address['street2']) ? 'empty' : 'not empty';
E 'l'operatore ternario a.k.a operatore Elvis (google: P) che si sta cercando.
echo $address['street2'] ?: 'Empty';
Si restituisce il valore della variabile o predefinito se la variabile è vuota.
Si noti che quando si utilizza operatori condizionali nidificate, si consiglia di utilizzare le parentesi per evitare possibili problemi!
Sembra che PHP non funziona allo stesso modo come 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 # ritorno "eccezionale" in entrambi i casi.
Nel secondo caso, quello che fa PHP è (o almeno questo è quello che ho capito):
- è
$score > 10
? Sì - è
$age > 10
? no, in modo che il$age > 10 ? 'Average' : 'Exceptional'
attuali restituisce 'Eccezionale' - poi, invece di una semplice pausa di tutta la dichiarazione e la restituzione 'eccezionale', prosegue valutando l'istruzione successiva
- l'istruzione successiva diventa
'Exceptional' ? 'Horrible' : 'Average'
che restituisce 'orribile', come 'eccezionale' è truthy
Dalla documentazione: http://php.net/manual/en/ language.operators.comparison.php
Si consiglia di evitare di "stacking" espressioni ternari. PHP di comportamento quando si utilizza più di un operatore ternario all'interno di una singola dichiarazione non è ovvia.
condizionale messaggio di benvenuto
echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';
nidificati PHP Stenografia
echo 'Your score is: '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );
È possibile farlo ancora più breve, sostituendo echo
con <?= code ?>
<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>
Questo è utile soprattutto quando si vuole determinare, all'interno di una barra di navigazione, se l'opzione di menu deve essere visualizzato come già visitato (clic) oppure no:
<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>
Ecco alcuni esempi interessanti, con una o più svariate condizioni.
$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>";
Credo che hai usato le staffe nel modo sbagliato. Prova questo:
$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
Credo che dovrebbe funzionare, è anche possibile utilizzare:
echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
C'è anche un operatore ternario stenografia e sembra che questo:
(espressione1):? Espressione2 tornerà espressione1 se restituisce true o espressione2 altrimenti
.Esempio:
$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';
restituirà
Apples are great!
Dal PHP 5.3, è possibile lasciare fuori la parte centrale del operatore ternario. Espressione expr1:? Rendimenti expr3 expr1 se espr1 restituisce true, e expr3 altrimenti.
Da Manuale PHP