【问题标题】:PHP assign first not-null valuePHP分配第一个非空值
【发布时间】:2013-07-03 05:09:52
【问题描述】:

我有一些像这样的三个值:

$a = null
$b = 3;
$c = null

(我永远不知道 null 会是什么:也许全部,也许没有。)

在所谓的延迟加载之后,我尝试以这种方式分配 first 非空值:

$d = $a or $b or $c;

(类似于JavaScript方式var d = a || b;(没有a就赋值b)

但在 PHP 中它似乎不起作用。

我做错了吗,或者什么是最好和最简单的方法?

【问题讨论】:

标签: php variables


【解决方案1】:

您可以在 PHP 5.3+ 中使用短三元运算符:

$d = $a ?: $b ?: $c;

请注意,这确实会像 JS 中一样进行强制转换。


更新 (PHP 7)

在 PHP 7.0+ 中你会这样做(称为null coalescing - more informations):

$d = $a ?? $b ?? $c;

【讨论】:

  • @hsz:为澄清而添加。
  • 我不知道你能做到这一点。太棒了:D
  • @Kluska000:我想类型强制就是我的意思。 '' == 0 == false == null。更多这里php.net/manual/en/language.types.type-juggling.php
  • 哈!刚刚注意到这个问题在我做完几个小时后更新了我的答案(尽管没有提到任何细微之处)。这就是建立声誉的方式!
【解决方案2】:

试试这个...

$d = array_filter(array($a, $b, $c))[0]; //newer PHP only

或者这个:

$d = current(array_filter(array($a, $b, $c))); //warning about references

或者这个:

$tmp = array_filter(array($a, $b, $c));
$d = current($tmp); //most safe

【讨论】:

  • 当您想要合并任意数量或未知数量的值时,这是更好的解决方案。
【解决方案3】:

在 PHP 7 中,您可以使用“Null coalescing”运算符:

$d = $a ?? $b ?? $c;

这将分配第一个非空值(如果没有,则为空),正如问题所问的那样。

与其他一些答案不同,它不会被隐式类型转换绊倒,例如,

$b = 0; $c = 1;
$d = $a ?? $b ?? $c;
echo $d;

将输出 0:它不会介意 $a 根本没有被设置并且不会超过 $b,即使它类型转换为 false

【讨论】:

    【解决方案4】:

    如果您可以将变量放入数组中,这会有所帮助:

    $d = current(array_filter(array($a, $b, $c)));
    

    或者这也可以是一个方法:

    if(!empty($a)) {
     $d = $a;
    
    } 
    

    此检查可能会针对 $b$c 等所有变量继续进行

    【讨论】:

      【解决方案5】:

      在 php 中你可以这样做:-

      `<?php
       $a = 1;
       $b = null;
       $c = null;
       $d = $a ? $a:($b?$b:($c?$c:'null'));
      echo $d;
      ?>`
      

      【讨论】:

        【解决方案6】:

        你可以试试:

        $d = !is_null($a) ? $a : (!is_null($b) ? $b : $c);
        

        【讨论】:

          猜你喜欢
          • 2012-06-24
          • 1970-01-01
          • 2017-09-02
          • 2021-01-04
          • 2014-05-12
          • 1970-01-01
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多