Answers:
在php 5.3中有一个新的运算符可以做到这一点: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
返回false
。操作员确实很理智。
PHP 7引入了一个真正的合并运算符:
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
如果之前的值??
不存在或者是null
之后的值??
。
对上述?:
运算符的改进是,,该运算符??
还可以处理未定义的变量而不会引发E_NOTICE
。
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
over 的优点??
在于,它也可以合并空值,而??
不会合并。与JavaScript中逻辑OR运算符的行为类似(即$val || 'default'
),如果在我们的实践中最终发现自己以相同的方式处理空值和空值(即),我会发现?:
这是一种更实用的合并形式。而且,如果您想进一步加剧和吞并这个问题,甚至可以提出以下质疑:$val ?: 'default'
E_NOTICE
echo @$val ?: 'default';
首次在Google上投放“ PHP Coalesce”。
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
我真的很喜欢?:运算符。不幸的是,它尚未在我的生产环境中实现。所以我使用了等效的方法:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
coalesce
应该返回遇到的第一个非null参数,其中包括FALSE
。FALSE
但是,此函数将丢弃,可能不是op所考虑的(至少不是我想要从coalesce
函数中获取的)。
值得注意的是,由于PHP对未初始化的变量和数组索引的处理,所以任何种类的合并函数的用途都是有限的。我希望能够做到这一点:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
但是,在大多数情况下,这将导致PHP出现E_NOTICE错误。在使用变量之前测试变量是否存在的唯一安全方法是直接在empty()或isset()中使用它。如果您知道合并中的所有选项都已初始化,则Kevin建议的三元运算符是最佳选择。
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
)。
确保准确确定希望此功能与某些类型一起使用的方式。PHP具有各种各样的类型检查或类似功能,因此请确保您知道它们的工作方式。这是is_null()和empty()的示例比较
$testData = array(
'FALSE' => FALSE
,'0' => 0
,'"0"' => "0"
,'NULL' => NULL
,'array()'=> array()
,'new stdClass()' => new stdClass()
,'$undef' => $undef
);
foreach ( $testData as $key => $var )
{
echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>";
echo '<hr>';
}
如您所见,empty()对所有这些都返回true,但是is_null()仅对其中2个返回true。
我在扩展Ethan Kent发布的答案。由于array_filter的内部工作原理,该答案将舍弃评估为false的非null参数,而这通常不是coalesce
函数通常要做的。例如:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
哎呀
为了克服这个问题,需要第二个参数和函数定义。的可调用的功能是负责告诉array_filter
是否到当前数组值添加到结果数组:
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
如果您可以简单地将isset
或'isset'
作为第二个参数传递给array_filter
,但没有这种运气,那将是很好的。
PHP 5.3+,带有闭包:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
演示:https : //eval.in/187365
??
的PHP 7