2012-06-16 32 views
0

可能重复:
Coalesce function for PHP?PHP中的贯穿变量赋值?

我不知道这是什么通常被称为,但我希望标题沟通不够好。我拥有的是一些变量,其中一些可能为空。

我想做的事:

$a = $b || $c || $d; 

其中$一个最终被=的第一个非空的变量。

+0

您是否试图将b或c或d的内容分配给a:\? – theBigChalk

+2

错误的语言。它可以在Ruby或JavaScript中工作。在PHP,AFAIK中,您需要使用trinary运算符并编写'$ b!== null? $ b:($ c!== null?$ c:$ d)' – Amadan

+0

另请参阅:http://stackoverflow.com/questions/1013493/coalesce-function-for-php – Wrikken

回答

4

据我所知,PHP不支持JavaScript的相同方式。

你可以,但是做这样的事情:

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

一个更通用的解决方案:

function fallthrough($arr) { 
    //$arr should be an array of possible values. The first non-null value is returned 
    do $a = array_shift($arr); 
    while($a === null && $arr); 
    return $a; 
} 
+0

那么,什么是最好的方法在PHP中做到这一点?显然,我不能仅仅嵌套三元运算符,因为这会带来更多变量的疯狂。我只是有一个很大的elseif块吗? – Joren

+0

小心 - 如果'$ b'为'“0”',它会通过。更确切地说,它会通过任何虚假的价值。如果你真的只需要'null'来通过,你需要明确地测试。 – Amadan

+0

你可以做的是定义一个函数。我将用解决方案编辑我的答案。 –

3
<?php 
$a = 0; 
$b = false; 
$c = true; //should become this 
$d = '1'; 
$e = $a ?: $b ?: $c ?: $d; 
var_dump($e); 
//bool(true) 

//should be '1' if order is different 
$e = $a ?: $b ?: $d ?: $c; 
var_dump($e); 
//string(1) "1" 

...但是?:还挺新的,你会混淆你的同事/编码人员。

+0

哦,如上所述:在所有的谬误值上失败,而不仅仅是NULL。 – Wrikken

0

我不认为这是可能的。我认为你不得不使用其他更加费力的方式。即使变量数组,遍历它,直到你找到一个非空值,并打破循环,就像这样:

$vars = array("b" => $b, "c" => $c, "d" => $d); 

foreach($vars as $var) { 
    if($var != null) { 
     $a = $var; 
     break; 
    } 
} 

嗯,就像这里的一些其他的答案说,你可以用文字的速记方法这个,但是编写可读代码也很重要。上面的代码是非常可读的。