Як я можу використовувати потрійний оператор (?:) В PHP як скорочення для "якщо / ще"?


118

На підставі прикладів на цій сторінці внизу є зразки робочого та непрацюючого коду.

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

4
Це виглядає правильно. Ви намагалися повторити $ test ;?
Брайан Фішер

Ваше запитання обманює деяких добровольців та дослідників, оскільки ви не пишете завдання, використовуючи короткочасне потрійне вираз (немає "Оператора Елвіса") - ви пишете довічне потрійне вираз. Різниця полягає в тому, що ви оголошуєте обидва повернені значення залежно від оцінки. При скороченому оцінці, якщо вхідне значення "truthy", воно повертається; якщо це "falsey", то повертається резервне значення (це значення, оголошене після оператора Elvis). Тут також помітно погана реалізація Null Coalescing Operator.
mickmackusa

Відповіді:


234

The

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

синтаксис не є оператором "стенограма", якщо ( ?називається умовним оператором), оскільки ви не можете виконати код так само, як якщо б ви зробили:

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.


Це різниця між твердженням та виразом
pmiranda

2
Що таке скорочення? condition ?: falseякий оцінює, conditionчи є його правдою?
oldboy

44

PHP 7+

За станом на PHP 7, це завдання можна виконати просто за допомогою оператора злиття Null таким чином:

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


3
Просто FYI, якщо $address['street2']це порожній рядок. Він прийме його і не повернеться 'Empty'. isset() != empty(). Це працюватиме лише у тому випадку, якщо значенняnull
AFwcxx,

Ну, я просто наводив приклад. Але я змінив код. Дякую !
Рабін Лама Донг

2
Який вихід, якщо $address['street2']він не порожній?
AliN11

Якщо $ address ['street2'] не порожня, вона виводить певну форму "true". Звичайна форма вищезазначеного більше нагадує: echo $address['street2'] ?? 'Empty';однак, як було сказано, він є " оператором злиття нуля ", тому він перевіряє лише нуль, а не порожній. Це відбувається тому ?? Ефективно скорочення для isset ().
Брайан C

1
Увійшов, щоб підтвердити цю відповідь. Це зовсім не робить те, що рекламується.
TKoL

28

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

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

посилання: https://davidwalsh.name/php-ternary-examples


2
Ви отримали його з короткого веб-сайту та навіть не
Річард

1
@Richard додав посилання
Арун Йокеш

Є це ? У контексті StackOverflow це завжди тонка лінія, я маю на увазі, що Q запитував щось, не в змозі знайти його, а потім хтось ще доставив цей вміст. Чи несправедливо копіювати наявний вміст, якщо він допомагає та додає цінність цьому запиту? Я думаю, що відповіді на StackOverflow - це не "ваш власний вміст" ... hmmm
Sliq

Перший приклад неправильний. )Недоречний. Він повинен передувати ?. Повна заява повинна бути$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

Потрійний оператор - це лише стенограма для блоку та if / else. Ваш робочий код не має іншого умови, тому не підходить для цього.

Наступний приклад спрацює:

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

6

Це термінальний оператор aka оператор Elvis (google it: P), якого ви шукаєте.

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

Він повертає значення змінної або за замовчуванням, якщо змінна порожня.


@Structed Я не можу погодитись з тим, що ви говорите, але гуглінг для цього дасть вам результат проппер, і це простіший термін нагадати
клавіатура ніндзя

4

Зауважте, що при використанні вкладених умовних операторів, можливо, ви захочете використовувати дужки, щоб уникнути можливих проблем!

Схоже, 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.comppare.php

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


3

Швидкий і короткий шлях:

echo $address['street2'] ? : "No";

Ось кілька цікавих прикладів з однією або кількома різноманітними умовами.

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";

2

Умовне вітальне повідомлення

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

2

Ви можете зробити це ще коротше, замінивши echoна<?= code ?>

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

Це корисно, особливо коли ви хочете визначити, що на панелі навігації, чи слід відображати параметр меню як уже відвідане (натиснуте) чи ні:

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


Чи потрібен () метод у цьому <? =?> Методі?
завитки

0

Думаю, ти скористався дужками неправильно. Спробуйте це:

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

Я думаю, що це має працювати, ви також можете використовувати:

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

0

Я думаю, ви, мабуть, не повинні використовувати потрійний оператор у php. Розглянемо наступний приклад:

<?php

function f1($n) {
    var_dump("first funct");
    return $n == 1;
}

function f2($n) {
    var_dump("second funct");
    return $n == 2;
}


$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);

Як ви думаєте, яка $aзмінна міститиме? (натяк: dos) І він залишиться тим самим, навіть якщо $fooзмінна буде призначена 2.

Щоб покращити ситуацію, вам слід відмовитися від використання цього оператора або оточити праву частину дужками таким чином:

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");

0

Ternary Operator - це в основному стенограма для оператора if / else. Ми можемо використовувати для зменшення кількох рядків коду та підвищення читабельності.

Ваш код для мене виглядає більш чистим. Але ми можемо додати більш чистий спосіб наступним чином-

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

Інший спосіб-

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

Примітка. Я додав дужку до всього виразу, щоб зробити його більш чистим. Я зазвичай робив це зазвичай для підвищення читабельності. З PHP7 ми можемо використовувати Null Coalescing Operator / php 7 ?? оператор для кращого підходу. Але ваша вимога це не відповідає.


-1

Є також скорочений термінальний оператор, і це виглядає приблизно так:

(вираз1)?: вираз2 поверне вираз1, якщо він оцінить до істинного чи виразу2 в іншому випадку.

Приклад:

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

повернеться

Apples are great!

Починаючи з PHP 5.3, можна залишати середню частину потрійного оператора. Вираз expr1?: Expr3 повертає expr1, якщо expr1 оцінює TRUE, а expr3 в іншому випадку.

З Посібника з PHP

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.