在 PHP 自己获得 coalesce 函数之前,有什么好的方法来实现它呢?
在 PHP 自己获得 coalesce 函数之前,有什么好的方法来实现它呢?
在php 5.3中有一个新的运算符能够实现这个功能:?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
- Benbobarray() ?: null ?: false
返回 false
。这个运算符确实很合理。 - Brad KochPHP 7引入了一个真正的合并运算符:
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
如果??
之前的值不存在或为 null
,则取??
之后的值。
?:
运算符的改进在于,??
处理未定义变量时不会抛出E_NOTICE
。
($_GET['doesNotExist'] ?? null) ?: 'fallback'
。 - Nathan Baulch?:
相对于 ??
的优势在于它也可以合并空值,而 ??
不能。类似于 JavaScript 中的逻辑 OR 运算符(即 $val || 'default'
)的行为,如果我们最终发现自己以相同的方式处理 空 和 null,那么我会认为 ?:
是一种更实用的 合并 形式。如果您想进一步强制执行此问题并忽略 E_NOTICE
,您甚至可以这样争辩:echo @$val ?: 'default';
- Matt Borja在谷歌上搜索"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
应该返回遇到的第一个非空参数,这将包括FALSE
。然而,这个函数将舍弃FALSE
,可能不是操作者想要的(至少不是我希望从coalesce
函数中得到的)。 - Madbreaks值得注意的是,由于PHP对未初始化变量和数组索引的处理方式,任何类型的合并函数都有限制。我希望能够这样做:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
但是在大多数情况下,这样做会导致PHP出现E_NOTICE错误。在使用变量之前,唯一安全的测试其存在的方法是直接在empty()或isset()中使用它。如果您知道合并运算符中的所有选项都已知,那么Kevin建议使用三元运算符是最佳选择。
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
)。 - Brilliand确保您准确地确定了希望此函数与特定类型一起使用的方式。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内部机制的原因,该答案会丢弃那些被评估为假的非空参数,而这并不是一个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的一些新功能来改进它。
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return $args[0];
}
使用闭包的 PHP 5.3+:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
演示:https://eval.in/187365
function coalesce(&...$args) { // ... as of PHP 5.6
foreach ($args as $arg) {
if (isset($arg)) return $arg;
}
}
在 PHP 7+ 中等同于 $var1 ?? $var2 ?? null
。
一个返回第一个非空值的函数:
function coalesce(&...$args) {
foreach ($args as $arg) {
if (!empty($arg)) return $arg;
}
}
在 PHP 5.3+ 中,等同于 (isset($var1) ? $var1 : null) ?: (isset($var2) ? $var2 : null) ?: null
。
上述代码将把数值字符串 "0.00" 视为非空。通常来自 HTTP GET、HTTP POST、浏览器 cookie 或 MySQL 驱动程序将浮点数或十进制数作为数值字符串传递的情况。
以下是一个函数,用于返回第一个未定义、null、(bool)false、(int)0、(float)0.00、(string)""、(string)"0"、(string)"0.00"、(array)[] 的变量:
function coalesce(&...$args) {
foreach ($args as $arg) {
if (!empty($arg) && (!is_numeric($arg) || (float)$arg!= 0)) return $arg;
}
}
用法如下:
$myvar = coalesce($var1, $var2, $var3, ...);
??
。 - kojiro