Основываясь на примерах с этой страницы , у меня есть примеры рабочих и нерабочих кодов ниже.
Рабочий код с использованием оператора 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, эту задачу можно выполнить просто с помощью оператора 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 (или, по крайней мере, это то, что я понимаю):
$score > 10
? да $age > 10
? нет, так что текущий $age > 10 ? 'Average' : 'Exceptional'
$age > 10 ? 'Average' : 'Exceptional'
возвращает «Исключительная», '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 />');