it-swarm-ru.tech

Если ноль, используйте другую переменную в одной строке в PHP

Есть ли в PHP что-то похожее на JavaScript:

alert(test || 'Hello');

Итак, когда test не определен или имеет значение null, мы увидим Hello, в противном случае - увидим значение test.

Я пробовал подобный синтаксис в PHP, но, похоже, он работает неправильно ... Кроме того, я понятия не имею, как решить эту проблему в Google ...

спасибо

Edit

Я, вероятно, должен добавить, что я хотел использовать его внутри массива:

$arr = array($one || 'one?', $two || 'two?'); //This is wrong

Но действительно, я могу использовать inline? : "Если заявление здесь, спасибо.

$arr = array(is_null($one) ? "one?" : $one, is_null($two) ? "two ?" : $two); //OK
49
rochal
echo (!$test) ? 'hello' : $test;

Или вы можете быть немного более крепким и сделать это

echo (!isset($test) || is_null($test)) ? 'hello' : $test; 
38
Jeff Busby

вы можете сделать echo $test ?: 'hello';

Это будет отображать $test, если оно истинно, и 'hello' в противном случае.

Примечание он выдаст уведомление или явную ошибку, если $test не установлен, но ...

Это не должно быть проблемой, так как большинство серверов настроено игнорировать эти ошибки. Большинство фреймворков имеют код, который вызывает эти ошибки.

50
Yamiko

Начиная с PHP 7 и далее вы можете использовать то, что называется оператор объединения , который делает именно то, что вам нужно, без E_NOTICE, который запускается ?:.

Чтобы использовать его, вы используете ??, который проверит, установлено ли значение слева и не ноль.

$arr = array($one ?? 'one?', $two ?? 'two?'); 
43
Yamiko

Я очень удивлен, что это не предлагается в других ответах:

echo isset($test) ? $test : 'hello';

Из документовisset($var) вернет false , если $var не существует или установлен к нулю .

Нулевой оператор объединения с PHP 7 и далее, описанный @Yamiko, является синтаксическим сокращением для вышеупомянутого.

В этом случае:

echo $test ?? 'hello'; 
4
Arth

Один лайнер. Супер читаемый, работает для обычных переменных, массивов и объектов.

// standard variable string
$result = @$var_str ?: "default";

// missing array element
$result = @$var_arr["missing"] ?: "default";

// missing object member
$result = @$var_obj->missing ?: "default";

Посмотрите это в действии: Php Sandbox Demo

3
TrophyGeek

Если вы хотите создать массив таким способом, array_map предоставляет более краткий способ сделать это (в зависимости от количества элементов в массиве):

function defined_map($value, $default) {
    return (!isset($value) || is_null($value)) ? $default : $value;
    // or return $value ? $default : $value;
}

$values = array($one, $two);
$defaults = array('one', 'two');

$values = array_map('defined_map', $values, $defaults);

Просто убедитесь, что вы знаете какие элементы оцениваются как false , чтобы вы могли применить правильный тест.

1
Felix Kling

Возможно, есть лучший способ, но это первое, что пришло мне в голову:

 echo (!$test) ? "Hello" : $test;
0
Sean Walsh

Нулевое значение ложно в PHP, поэтому вы можете использовать троичный:

alert($test ? $test : 'Hello');

Правка:

Это также верно для пустой строки, поскольку троичный использует равенство "===", а не "=="

И пустая или пустая строка является ложной, используя оператор '===' или '=='. Я действительно должен сначала проверить свои ответы.

0
AndrewKS

Что ж, расширение обозначений, которые вы предоставили, означает, что вы придумали:

if (test) {
    alert(test);
} else {
    alert('Hello');
}

Так что это просто простая конструкция if ... else. В PHP вы можете сократить простые конструкции if ... else как нечто, называемое "троичное выражение":

alert($test ? $test : 'Hello');

Очевидно, что в PHP нет эквивалента функции JS alert, но конструкция такая же.

0
Geoff Adams