Условный оператор только с верным утверждением - PullRequest
5 голосов
/ 16 июля 2009

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

if($myarray["foo"]==$bar){  
    $variablename=$myarray["foo"];  
}  

Это может оказаться довольно длинным, если имена переменных длинные, или, возможно, это связано с массивами, когда довольно просто, что я хочу сделать & mdash; установить значение, если условие истинно.

Я бы хотел использовать условный оператор, примерно так:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"]......

Но это не получается, потому что я не хочу, чтобы переменная вообще была установлена, если утверждение ложно.

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

У кого-нибудь есть предложения?

Ответы [ 9 ]

10 голосов
/ 16 июля 2009

Не намного короче, чем:

if($condition) $var = $value;
8 голосов
/ 16 июля 2009

IMO, лучший способ сделать ваш пример кода короче:

if($myarray["foo"] == $bar)
    $variablename = $myarray["foo"];

К вашему сведению, имя оператора, о котором вы спрашиваете, - это не «троичный оператор», это условный оператор .

Поскольку вы спрашиваете, вы можете использовать условный оператор для выполнения того, что вы спрашиваете:

$myarray['foo'] == $bar ? $variablename = $myarray['foo'] : null;

но это ужасно некрасиво и очень недостижимо.

3 голосов
/ 16 июля 2009

Вы могли бы сделать это, но я бы не стал, поскольку это довольно нечитабельно и глупо:

$myarray["foo"] == $bar ? $variablename = $myarray["foo"] : 0;

или

$myarray["foo"] == $bar && $variablename = $myarray["foo"];
2 голосов
/ 16 июля 2009

«Проблема», которая у вас есть, на самом деле не проблема. Ваш пример кода очень прост и понятен. Я бы действительно сказал, оставь все как есть.

Вы можете удалить скобки, но это повлияет на ремонтопригодность.

Другой альтернативой является создание функции-оболочки set_if_true (смешанный массив, строковый ключ, булево условие). Он скрывает то, что действительно происходит, но в зависимости от вашей конкретной реализации это хороший вариант. (Например, объект типа конфигурации или кеширующий сервер)

1 голос
/ 16 июля 2009

Ваше право, троичный не путь. Он предназначен для обработки части if и else оператора.

Просто придерживайтесь обычного оператора if.

if($myarray["foo"]==$bar) $variablename=$myarray["foo"];
0 голосов
/ 16 октября 2017

Поставьте != вместо == и ?: вместо просто ?..

$variablename = ($myarray["foo"] != "bar") ?: $myarray["foo"];

совпадает с

if($myarray["foo"] != "bar"){} else { $variablename = $myarray["foo"]; }

Возможно, это не самое умное решение, но оно работает. Мне нравится этот еще один

if($myarray["foo"] != "bar") {$variablename = $myarray["foo"]};
0 голосов
/ 16 июля 2009

Троичный не способ, даже если его можно написать так, чтобы троичные произведения.

Причина в следующем: вы пытаетесь использовать его не по назначению, что сделает ваш код неудобным для чтения другими разработчиками.

0 голосов
/ 16 июля 2009

Вы можете поместить исходное выражение в часть else троичной операции, но если вы хотите гарантировать однократную оценку выражения, вам придется использовать временную переменную и оператор if.

0 голосов
/ 16 июля 2009

Установить переменную себе в ложном случае:

$variablename=($myarray["foo"]=="bar")? $myarray["foo"] : $variablename
...