如果为null,则在PHP的一行中使用其他变量


70

PHP中是否有类似于JavaScript的东西:

alert(test || 'Hello');

因此,当test未定义或为null时,我们将看到Hello,否则-我们将看到test的值。

我在PHP中尝试了类似的语法,但它似乎无法正常工作。此外,我也不知道如何使用Google搜索这个问题。

谢谢

编辑

我可能应该补充一点,我想在数组中使用它:

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

但是确实,我可以使用内联'?:'如果在这里也声明,谢谢。

$arr = array(is_null($one) ? "one?" : $one, is_null($two) ? "two ?" : $two); //OK

如果您要创建一个包含3个以上元素的数组,请查看我的答案,以节省很多三元运算符;)
Felix Kling

好吧,是的,显然我将其放入某种效用函数中了;)谢谢
rochal 2011年

Answers:


50

有关PHP7解决方案,请参见下面的@Yamiko的答案https://stackoverflow.com/a/29217577/140413

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

或者,您可以更强大一些,然后执行此操作

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

3
为什么要检查!$ test而不仅仅是$ test?$ test:'你好'; 代替?
AndrewKS,2011年

4
好吧,他说如果$ test是undefined或为null,他想看“ Hello”,如果$ test的值是int(0),即使设置了它,它仍然会问好,而不是null,因为php会将0解释为false,除非您正在使用===。因此,为了安全起见,他应该检查$ test是否已设置且不为null。至少那是我的逻辑。
Jeff Busby

我理解,但你的决心非常混乱:(这不应该是按照“如果在PHP一行空使用其他变量” @yamiko的答案以及useful.l很简单的一个公认的答案。
桑蒂

|| is_null()这里是多余的,isset($var)如果$var为null ,则返回false
Arth 18'Feb

62

你可以做 echo $test ?: 'hello';

$test如果为true,则将回显,'hello'否则为。

请注意,如果$test未设置,则会引发通知或严格错误。

这应该不是问题,因为大多数服务器都设置为忽略这些错误。大多数框架都有触发这些错误的代码。


编辑: 这是一个经典的三元运算符,但中间部分被忽略了。自PHP 5.3起可用。

echo $test ? $test : 'hello'; // this is the same
echo $test ?: 'hello';        // as this one

这仅检查第一个变量的真实性,而不检查是否未定义,在这种情况下,它将触发E_NOTICE错误。对于后者,请查看下面的PHP7答案(希望很快就会在上面)。


1
我同意,但是主要的库和插件会一直触发它们,因此在生产中通常会忽略它们。同样,这种类型的错误是E_NOTICE,这是可以忽略的错误。我个人不喜欢触发包括E_NOTICE在内的任何类型的错误,但是这种类型的错误更多是关于最佳实践,而不是需要修复的实际错误
Yamiko

我也知道过早的优化是不好的,除了触发通知外,所有其他原因都会导致错误处理函数(无论是PHP的默认值还是自定义函数)被调用,即使该函数最终由于您的error_reporting设置而忽略了错误,也可能会很慢特别是如果您在循环中执行此操作。
thomasrutter

:?运算符的名称是什么?有人可以链接到文档吗?
inafalcao

@inafalcao它是经典的三元运算符,但中间部分省略了。因此,它使它成为速记三元运算符。自PHP 5.3起可用。
dboris

1
整洁,我从来不知道这一点。你可以说?:?因为+==...有点儿。
特工

58

从PHP 7开始,您可以使用称为结余运算符的功能,该功能可以在没有E_NOTICE?:触发的情况下完全满足您的要求。

要使用它,请使用??它将检查左侧的值是否已设置并且不为null。

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

5

我很惊讶在其他答案中没有建议这样做:

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

如果不存在或设置为null ,则从文档isset($var)返回false$var

@Yamiko描述了PHP 7及以后版本的null合并运算符,它是上述语法的快捷方式。

在这种情况下:

echo $test ?? 'hello'; 

5

一线。超级可读,适用于常规变量,数组和对象。

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

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

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

实际操作中:Php沙盒演示



1

如果要以这种方式创建数组,请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就可以应用正确的测试。



0

Null在PHP中为false,因此可以使用三元:

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

编辑:

这对于空字符串也适用,因为三元使用'==='等式而不是'=='

无论使用'==='还是'=='运算符,空字符串或null字符串都是false。我真的应该先测试我的答案。


0

好吧,扩展您提供的表示法意味着您想到了:

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

因此,如果... else结构很简单。在PHP中,您可以将if ... else的构造简化为称为“三元表达式”的形式:

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

显然alert,PHP中没有等效于JS函数的函数,但是其构造是相同的。



-1

我最近遇到了同样的问题。这就是我解决的方法:

<?php if (empty($row['test'])) {
                    echo "Not Provided";} 
                        else {
                    echo $row['test'];}?></h5></span></span>
              </div>

您在数据库中的值位于变量$ test..so中,因此如果$ test行为空,则回显未提供

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.