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; }
我真的很喜欢?:操作符。 不幸的是,它还没有在我的生产环境中实现。 所以我使用相当于这个:
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_filter
, array_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