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

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

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

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

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

PHP 7+

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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