PHP的合并功能?

mik*_*ikl 130 php optimization null-coalescing-operator

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

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

Kev*_*vin 191

php 5.3中有一个新的运算符,它执行此操作: ?:

// A
echo 'A' ?: 'B';

// B
echo '' ?: 'B';

// B
echo false ?: 'B';

// B
echo null ?: 'B';
Run Code Online (Sandbox Code Playgroud)

资料来源:http://www.php.net/ChangeLog-5.php#5.3.0

  • 多个三元快捷键怎么样,就像"echo $ a?:$ b?:$ c?:$ d;" 工作? (25认同)
  • 请记住,这不仅仅接受其他语言中的非null类似coalesce,而是接受任何值,它将隐式转换为布尔值.因此,请务必仔细阅读[类型转换规则](http://www.php.net/manual/en/types.comparisons.php) (6认同)
  • 对数组不起作用.例如,当试图检查未定义的数组元素是否为false时将导致错误.`$ input ['properties'] ['range_low']?:'?'`` (5认同)
  • 无论使用合并运算符,都应该获得未定义的索引通知. (5认同)
  • 我刚刚测试了它,确实有效.好建议. (4认同)
  • 多个 falsey 参数返回最后一个参数,`array() ?: null ?: false` 返回 `false`。运营商确实是理智的。 (2认同)
  • 正如 DanMan 所说,这不是标题所暗示的“合并”。Will Shaver 的答案实际上是合并的。Coalesce 返回第一个非空值。($value ?: $other) 与 ($value ? $value : $other) 相同。因此,如果 $value === false 则返回 $other 。真正的合并将返回 false,因为 $value 是非空的。 (2认同)

flo*_*ori 65

PHP 7引入了一个真正的合并运算符:

echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
Run Code Online (Sandbox Code Playgroud)

如果之前的值??不存在或者是之后null的值??.

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

  • @timeNomad你仍然需要为空,它只检查null (7认同)

Wil*_*ver 29

在谷歌上首次出现"php coalesce".

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
      return $arg;
    }
  }
  return NULL;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @ [Alfred,Ciaran] - 你错了.foreach()只计算第一个参数一次,得到一个数组,然后迭代它. (17认同)
  • 保存一点ram并且不要将args复制到数组中,只需执行foreach(func_get_args()as $ arg){} (9认同)
  • @Savageman ......确切地说......如果你想要从你的应用程序中挤出这毫秒的性能或几个字节的内存,你可能会看到错误的性能/内存瓶颈 (7认同)
  • 将func_get_args()放在foreach(此处为$ arg)中,从性能的角度来看,不会改变任何内容. (6认同)
  • 具有讽刺意味的是,这是Google上"php coalesce"的首次亮相. (4认同)

小智 18

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

function coalesce() {
  return array_shift(array_filter(func_get_args()));
}
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢它,但必须同意@hakre - `coalesce`应该返回它遇到的第一个*非null*参数,其中包括`FALSE`.这个函数会丢弃'FALSE`,可能不是op的意思(至少不是我想要的'coalesce`函数). (3认同)
  • false不是NULL. (2认同)

And*_*rew 9

值得注意的是,由于PHP处理未经初始化的变量和数组索引,任何类型的合并函数的用途都是有限的.我希望能够做到这一点:

$id = coalesce($_GET['id'], $_SESSION['id'], null);
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*ley 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>';
}
Run Code Online (Sandbox Code Playgroud)

如您所见,empty()为所有这些返回true,但is_null()仅对其中2个执行此操作.