Как использовать тернарный оператор (?:) В PHP как сокращенное выражение для "if/else"?
Основываясь на примерах из этой страницы, у меня есть примеры рабочего и нерабочего кода ниже.
Рабочий код с использованием оператора if
:
if (!empty($address['street2'])) echo $address['street2'].'<br />';
Неработающий код с использованием троичного оператора:
$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
ОБНОВИТЬ
После подсказки Брайана я обнаружил, что вывод $test
дает ожидаемый результат. Следующее работает как шарм!
echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
Ответы
Ответ 1
(condition) ? /* value to return if condition is true */
: /* value to return if condition is false */ ;
Синтаксис не является оператором "стенограммы if" (?
называется условным оператором), потому что вы не можете выполнять код так же, как если бы вы делали:
if (condition) {
/* condition is true, do something like echo */
}
else {
/* condition is false, do something else */
}
В вашем примере вы выполняете инструкцию echo
, когда $address
не пуст. Вы не можете сделать то же самое с условным оператором. Однако вы можете сделать echo
результат условного оператора:
echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];
и на экране появится сообщение "Улица пуста!" если он пуст, в противном случае он отобразит адрес street2.
Ответ 2
PHP 7+
Начиная с PHP 7, эту задачу можно выполнить просто с помощью оператора объединения Null, например:
echo !empty($address['street2'])?? 'Empty';
Ответ 3
Основная истина/ложная декларация
$is_admin = ($user['permissions'] == 'admin' ? true : false);
Условное приветственное сообщение
echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';
Сообщение о условных элементах
echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';
Ответ 4
Тернарный оператор является просто сокращением, а if/else - блоком. В вашем рабочем коде нет условия else, поэтому для этого не подходит.
Следующий пример будет работать:
echo empty($address['street2']) ? 'empty' : 'not empty';
Ответ 5
Это тернарный оператор, он же оператор Элвиса (Google: P), который вы ищете.
echo $address['street2'] ?: 'Empty';
Возвращает значение переменной или значение по умолчанию, если переменная пуста.
Ответ 6
Обратите внимание, что при использовании вложенных условных операторов вы можете использовать скобки, чтобы избежать возможных проблем!
Похоже, что PHP не работает так же, как, по крайней мере, Javascript или С#.
$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');
Тот же код в Javascript и С# возвращает "Исключительный" в обоих случаях.
Во втором случае, что делает PHP (или, по крайней мере, это то, что я понимаю):
-
$score > 10
? да
- -
$age > 10
? нет, поэтому текущий $age > 10 ? 'Average' : 'Exceptional'
возвращает "Исключительный"
- то вместо того, чтобы просто останавливать весь оператор и возвращать "Исключительно", он продолжает оценивать следующее утверждение
- следующий оператор становится
'Exceptional' ? 'Horrible' : 'Average'
, который возвращает "Horrible", так как "Исключительный" является правдивым
Из документации: http://php.net/manual/en/language.operators.comparison.php
Рекомендуется избегать тройных выражений. РНР поведение при использовании более одного тернарного оператора в пределах одного утверждение неочевидно.
Ответ 7
Условное приветственное сообщение
echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';
Вложенное сокращение PHP
echo 'Your score is: '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );
Ответ 8
Вы можете сделать это еще короче, заменив echo
на <?= code?>
<?=(empty($storeData['street2']))? 'Yes <br/>': 'No <br/>'?>
Это особенно полезно, когда вы хотите определить, на панели навигации, должна ли опция меню отображаться как уже посещенная (нажатая) или нет:
<li<?=($basename=='index.php'? ' class="active"': '')?>><a href="index.php">Home</a></li>
Ответ 9
Вот несколько интересных примеров с одним или несколькими различными условиями.
$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>";
Ответ 10
Я думаю, что вы использовали скобки неправильно. Попробуйте следующее:
$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
Я думаю, что он должен работать, вы также можете использовать:
echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
Ответ 11
Внимание !!! Проверьте следующий код и затем примите решение.
$arg = 'T';
$vehicle = ( ( $arg === 'B' ) ? 'bus' :
( $arg === 'A' ) ? 'airplane' :
( $arg === 'T' ) ? 'train' :
( $arg === 'C' ) ? 'car' :
( $arg === 'H' ) ? 'horse' :
'feet' );
echo $vehicle;
печатает лошадь
!!??
Ответ 12
Там также есть сокращенный троичный оператор, и это выглядит так:
(expression1)?: expression2 вернет expression1, если оно оценивается как true или expression2 в противном случае.
Пример:
$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';
вернусь
Apples are great!
Начиная с PHP 5.3, можно опустить среднюю часть троичного оператора. Выражение expr1?: Expr3 возвращает expr1, если expr1 оценивается как TRUE, и expr3 в противном случае.
Из руководства по PHP