如何从一组变量中分配第一个非false变量


How to assign first non false variable from a group of them

我尝试了这种方法,但没有效果:

$a = false;
$b = false;
$c = 'sometext';
$result = $a or $b or $c or exit('error: all variables are false');

$result应该设置为$c,但这会给出bool(false)的值。

关于:

$result = $a ?: $b ?: $c ?: exit('doh!');
($result = $a) || ($result = $b) || ($result = $c) || exit("no");

或者,如果您想要0和空字符串等,则不算作错误:

(($result = $a) !== false) || (($result = $b) !== false) || (($result = $c) !== false) || exit("no");

想想这是否真的可读。你也可以使用老式的方式:

if ($a !== false)
  $result = $a;
elseif ($b !== false)
  $result = $b;
elseif ($c !== false)
  $result = $c;
else
  exit("no");

编辑:以防万一你需要一些动态的东西;-(。

foreach(array('a','b','c') as $key)
  if (($result = $$key) !== false)
    break;
if ($result === false)
  exit("no");

这里有两件事:

首先,在PHP中,布尔运算的结果是布尔值。

其次,更微妙的是,"英语"布尔运算符(orand(的优先级较低,低于赋值运算符=

因此,在此表达式中,$result将始终获得$a的实际值(与$a的值无关(,因为赋值应用于布尔运算符之前。

// This has the same effect:
$result = $a or $b or $c;
// As this:
$result = $a;
$a or $b or $c; // this has no effect

这是令人困惑的,几乎可以肯定不是你想要的。

要获得$a$b$c中任何一个是否为真(即true或可转换为true(的布尔结果,可以使用括号强制设置优先级,也可以使用优先级较高的"C样式"运算符(||&&(:

// These all have the same effect:
$result = ($a or $b or $c);
$result = $a || $b || $c;
if ($a or $b or $c)
  $result = true;
else
  $result = false;
if ($a || $b || $c)
  $result = true;
else
  $result = false;

如果你不确定运算符的优先级,最好使用括号——它们也有助于提高代码的可读性,因为求值的顺序变得更加明显。

通常情况下,最好不要依赖隐式类型转换(尤其是强制转换非数字字符串(,因为这往往会导致代码不清楚。

编辑:

为了回答实际的问题,另一种方法(尽管在这种情况下我并不建议这样做,因为你说你只对第一个非false值感兴趣(是在没有回调的情况下使用array_filter——这将返回一个所有输入数组中的值的数组,这些值是truthy的,并保留键。

例如:

$a = false;
$b = false;
$c = 'sometext';
$result = array_filter(array($a, $b, $c));
var_dump($result);

输出:

array(1) {
  [2]=>
  string(8) "sometext"
}

布尔运算符的结果在php中是布尔的。

$a = false;
$b = false;
$c = 'sometext';
$result = null;
foreach(array('a', 'b', 'c') as $k)
{
    if($$k !== false)
    {
        $result = $$k;
        break;
    }
}

另外,考虑将变量移动到数组中。