合并功能PHP?合并功能PHP?(Coalesce function for PHP?)

2019-05-13 12:55发布

很多编程语言有COALESCE函数(返回第一个非NULL值, 例如 )。 PHP,可悲的是在2009年,其实不然。

什么是执行一个在PHP PHP之前本身得到了COALESCE功能的好方法?

Answer 1:

有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



Answer 2:

PHP 7引入了真正的聚结操作 :

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

如果说之前的价值?? 不存在或者是null后的价值?? 取。

在上面提到的改善?:运营商,即?? 也处理未定义的变量未抛出E_NOTICE



Answer 3:

先打了“PHP聚结”上谷歌。

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

http://drupial.com/content/php-coalesce



Answer 4:

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

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


Answer 5:

值得注意的是,由于PHP的处理uninitalised变量,数组索引,任何一种聚结的功能是有限的使用。 我希望能够做到这一点:

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

但这种意志,在大多数情况下,导致PHP与E_NOTICE错误。 使用它之前进行测试的变量存在的唯一安全的方法是直接在空()或isset使用它()。 由凯文提出的三元运算符是最好的选择,如果你知道你的聚结所有的选项都知道被初始化。



Answer 6:

请务必准确识别您希望此功能与某些类型的工作。 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个这样做。



Answer 7:

我扩大所张贴的答案伊桑肯特 。 这个问题的答案将放弃计算结果为假非空的论点由于内部运作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 ,但没有这样的运气。



Answer 8:

我目前使用这个,但我不知道,如果它不能与一些在PHP 5的新特性得到改善。

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


Answer 9:

PHP 5.3+,与关闭:

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

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



文章来源: Coalesce function for PHP?