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

StackOverflow https://stackoverflow.com/questions/1506527

Вопрос

На основе примеров с этой страницы, ниже приведены рабочие и нерабочие примеры кода.

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

Решение

А

(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.

Другие советы

PHP 7+

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

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

Основное истинное/ложное заявление

$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' : '').'.';

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

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

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

Вам нужен троичный оператор, он же оператор Элвиса (погуглите: P).

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

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

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

Похоже, 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. затем вместо того, чтобы просто остановить весь оператор и вернуть «Исключительно», он продолжает оценивать следующий оператор
  4. следующее утверждение становится 'Exceptional' ? 'Horrible' : 'Average' который возвращает «Ужасно», поскольку «Исключительно» является правдивым

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

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

Условное приветственное сообщение

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') );

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

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

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

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

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

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

Мне кажется, вы неправильно использовали скобки.Попробуй это:

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

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

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

Существует также сокращенный тернарный оператор, который выглядит следующим образом:

(выражение1) ?:выражение2 вернет выражение1 если он оценивается как true или выражение2 в противном случае.

Пример:

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

вернется

Apples are great!

С момента PHP 5.3 можно пропустить среднюю часть тройного оператора.Выражение выражение1 ?:expr3 возвращает expr1, если Expr1 оценивает True, и expr3 в противном случае.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top