PHP合并function?

许多编程语言都有一个合并函数(返回第一个非NULL值, 例如 )。 PHP,可悲的是,不。

什么是在PHP中实现一个好的方法?

在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的值为null 被采取。

提到的?:运算符的改进是, 也不处理未定义的variables而不抛出E_NOTICE

首先在google上打“php coalesce”。

 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对未初始化variables和数组索引的处理,任何一种聚合函数的使用都是有限的。 我希望能够做到这一点:

 $id = coalesce($_GET['id'], $_SESSION['id'], null); 

但是在大多数情况下,这会导致PHP出现E_NOTICE错误。 在使用它之前testingvariables的存在的唯一安全方法是直接在empty()或isset()中使用它。 凯文build议的三元运算符是最好的select,如果你知道你的合并中的所有选项已知被初始化。

确保你确切地确定你想如何使用某些types的函数。 PHP有各种各样的types检查或类似的function,所以确保你知道他们是如何工作的。 这是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个这样做。

我正在扩大Ethan Kent发布的答案。 这个答案会抛弃由于array_filter的内部工作而导致计算结果为false的非空参数,这不是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的第二个parameter passing的array_filterarray_filter ,但是没有这样的运气。

干杯

我目前正在使用这个,但我不知道PHP 5中的一些新function是否无法改进。

 function coalesce() { $args = func_get_args(); foreach ($args as $arg) { if (!empty($arg)) { return $arg; } } return $args[0]; } 

PHP 5.3+,closures:

 function coalesce() { return array_shift(array_filter(func_get_args(), function ($value) { return !is_null($value); })); } 

演示: https : //eval.in/187365