很多编程语言有COALESCE函数(返回第一个非NULL值, 例如 )。 PHP,可悲的是在2009年,其实不然。
什么是执行一个在PHP PHP之前本身得到了COALESCE功能的好方法?
很多编程语言有COALESCE函数(返回第一个非NULL值, 例如 )。 PHP,可悲的是在2009年,其实不然。
什么是执行一个在PHP PHP之前本身得到了COALESCE功能的好方法?
有PHP 5.3中新的运算符,它做到这一点: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
来源: http://www.php.net/ChangeLog-5.php#5.3.0
PHP 7引入了真正的聚结操作 :
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
如果说之前的价值??
不存在或者是null
后的价值??
取。
在上面提到的改善?:
运营商,即??
也处理未定义的变量未抛出E_NOTICE
。
先打了“PHP聚结”上谷歌。
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
http://drupial.com/content/php-coalesce
我真的很喜欢这个?:运算符。 不幸的是,还没有在我的生产环境中实施。 所以我用这个相当于:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
值得注意的是,由于PHP的处理uninitalised变量,数组索引,任何一种聚结的功能是有限的使用。 我希望能够做到这一点:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
但这种意志,在大多数情况下,导致PHP与E_NOTICE错误。 使用它之前进行测试的变量存在的唯一安全的方法是直接在空()或isset使用它()。 由凯文提出的三元运算符是最好的选择,如果你知道你的聚结所有的选项都知道被初始化。
请务必准确识别您希望此功能与某些类型的工作。 PHP有各种各样的类型检查或类似功能的,所以一定要确保你知道他们是如何工作的。 这是is_null()和空的一例的比较()
$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>';
}
正如你所看到的,空的()返回所有的这些事实,但is_null()只对其中2个这样做。
我扩大所张贴的答案伊桑肯特 。 这个问题的答案将放弃计算结果为假非空的论点由于内部运作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