Как использовать тернарный оператор (?:) в 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 />';
727   10  

10 ответов:

The

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

синтаксис не является оператором" shorthand if " (the ? называется условным оператором), потому что вы не можете выполнить код таким же образом, как если бы вы сделали:

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.

Основная Истинная / Ложная Декларация

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

PHP 7+

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

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

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

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

echo empty($address['street2']) ? 'empty' : 'not 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 или expression2 в противном случае.

пример:

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

вернутся

Apples are great!

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

С руководство PHP

Comments

    Ничего не найдено.