Как использовать троичный оператор (?:) В PHP как сокращение для «если /еще»?

На основе примеров с этой страницы у меня есть работающие и не примеры кода ниже.

Рабочий код с использованием оператора 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 />';

UPDATE
После подсказки Брайана я обнаружил, что повторение $test выводит ожидаемый результат. Следующее работает как шарм!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
75 голосов | спросил Steven 2 +04002009-10-02T01:13:41+04:00312009bEurope/MoscowFri, 02 Oct 2009 01:13:41 +0400 2009, 01:13:41

10 ответов


0

(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'];

и будет отображаться "Улица пуста!" если он пуст, в противном случае будет отображаться адрес улицы2.

ответил John Rasch 2 +04002009-10-02T01:30:55+04:00312009bEurope/MoscowFri, 02 Oct 2009 01:30:55 +0400 2009, 01:30:55
0

Основная правдивая /ложная декларация

$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' : '').'.';
ответил Arun Yokesh 8 MonEurope/Moscow2014-12-08T13:09:17+03:00Europe/Moscow12bEurope/MoscowMon, 08 Dec 2014 13:09:17 +0300 2014, 13:09:17
0

PHP 7 +

Начиная с PHP 7, эту задачу можно выполнить просто с помощью Нулевой оператор объединения , например:

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

ответил Rabin Lama Dong 6 J000000Thursday17 2017, 13:42:49
0

Тернарный оператор - это просто сокращение для блока if и if. В вашем рабочем коде нет условия else, поэтому он не подходит для этого.

Следующий пример будет работать:

echo empty($address['street2']) ? 'empty' : 'not empty';
ответил adrianbanks 2 +04002009-10-02T01:28:59+04:00312009bEurope/MoscowFri, 02 Oct 2009 01:28:59 +0400 2009, 01:28:59
0

Обратите внимание, что при использовании вложенных условных операторов вы можете использовать скобки , чтобы избежать возможных проблем!

Похоже, что PHP не работает так же, как по крайней мере Javascript или 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');

Один и тот же код в Javascript и C # возвращает «Исключительно» в обоих случаях.

Во втором случае PHP работает (или, по крайней мере, я так понимаю):

  1. это $score > 10? да
  2. это $age > 10? нет, поэтому текущий $age > 10 ? 'Average' : 'Exceptional' возвращает «Исключительно»
  3. затем, вместо того, чтобы просто остановить весь оператор и вернуть 'Exceptional', он продолжает вычислять следующий оператор
  4. следующее утверждение становится 'Exceptional' ? 'Horrible' : 'Average', которое возвращает «ужасное», так как «исключительное» является правдивым

Из документации: http://php.net/manual/en/language.operators.comparison.php

  

Рекомендуется избегать «сложения» троичных выражений. РНР   поведение при использовании более одного троичного оператора в одном   утверждение неочевидно.

ответил user276648 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 24 Sep 2014 14:40:28 +0400 2014, 14:40:28
0

Вы можете сделать это еще короче, заменив echo на <?= code ?>

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

Это особенно полезно, если вы хотите определить, на панели навигации, должен ли пункт меню отображаться как уже посещенный (нажатый) или нет:

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

ответил Pathros 2 PM00000090000005831 2015, 21:48:58
0

Вот несколько интересных примеров с одним или несколькими различными условиями.

$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>";
ответил Learning and sharing 4 J000000Wednesday18 2018, 00:04:55
0

Это оператор elvis (google it: P), который вы ищете.

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

Возвращает значение переменной или значение по умолчанию, если переменная пуста.

ответил Keyboard ninja 16 +03002018-10-16T17:32:22+03:00312018bEurope/MoscowTue, 16 Oct 2018 17:32:22 +0300 2018, 17:32:22
0

Я думаю, что вы использовали скобки неправильно. Попробуйте это:

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

Я думаю, что это должно работать, вы также можете использовать:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
ответил user2909855 7 SatEurope/Moscow2013-12-07T08:24:31+04:00Europe/Moscow12bEurope/MoscowSat, 07 Dec 2013 08:24:31 +0400 2013, 08:24:31
0

Есть также сокращенный троичный оператор, и он выглядит так:

(expression1)?: expression2 вернет expression1 , если оно будет иметь значение true или expression2 в противном случае.

Пример:

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

вернет

Apples are great!
  

Начиная с PHP 5.3, можно опустить среднюю часть   троичный оператор. Выражение expr1?: Expr3 возвращает expr1, если expr1   оценивается как ИСТИНА и expr3 в противном случае.

Из Руководство по PHP

ответил horas_ro 9 Jpm1000000pmTue, 09 Jan 2018 15:55:50 +030018 2018, 15:55:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132