PHP的合并功能?

时间:2009-06-18 15:49:15

标签: php optimization null-coalescing-operator

许多编程语言都有一个coalesce函数(返回第一个非NULL值example)。遗憾的是,PHP在2009年没有。

在PHP本身获得合并函数之前,用PHP实现一个好方法是什么?

9 个答案:

答案 0 :(得分:185)

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

答案 1 :(得分:61)

PHP 7引入了真正的coalesce operator

echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'

如果??之前的值不存在,或null之后的值为??

对提到的?:运算符的改进是,??还处理未定义的变量而不抛出E_NOTICE

答案 2 :(得分:29)

谷歌首次发布“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

答案 3 :(得分:18)

我真的很喜欢?:运算符。不幸的是,它还没有在我的生产环境中实现。所以我使用相当于:

function coalesce() {
  return array_shift(array_filter(func_get_args()));
}

答案 4 :(得分:9)

值得注意的是,由于PHP处理未经宣传的变量和数组索引,任何类型的合并函数的用途都是有限的。我很乐意能够做到这一点:

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

但是在大​​多数情况下,这会导致PHP出现E_NOTICE错误。在使用变量之前测试变量存在的唯一安全方法是直接在empty()或isset()中使用它。如果您知道合并中的所有选项都已初始化,那么Kevin建议的三元运算符是最佳选择。

答案 5 :(得分:6)

确保您确切地确定此功能如何与某些类型一起使用。 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。

答案 6 :(得分:2)

我正在扩展Ethan Kent发布的答案。该答案将丢弃由于array_filter的内部工作而评估为false的非null参数,这不是coalesce函数通常所做的。例如:

echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
  

糟糕

为了克服这个问题,需要第二个参数和函数定义。 callable 函数负责告诉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,那就太好了,但没有这样的运气。

答案 7 :(得分:0)

我目前正在使用它,但我想知道是否使用PHP 5中的一些新功能无法改进它。

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

答案 8 :(得分:0)

PHP 5.3+,带闭包:

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

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