8

如果我有以下布尔值

const YESTERDAY = false;
const TODAY = true;
const TOMORROW = false;

我可以编写什么代码来确保其中一个是真的?

我试过这个:

$x = self::YESTERDAY ^ self::TODAY ^ self::TOMORROW;

问题是所有三个常量都设置为truethen 。$xtrue

4

6 回答 6

9

$x = ((int) self::YESTERDAY) + ((int) self::TODAY) + ((int) self::TOMORROW);然后,如果$x === 1;你有你需要的东西。

编辑:

即使没有类型转换(int),它也能很好地工作,这要感谢@DaveRandom,所以:

if (self::YESTERDAY + self::TODAY + self::TOMORROW == 1) {},至于我。

于 2012-01-30T11:31:26.443 回答
3

我能想到的最简洁的方法是array_sum()

if (array_sum(array(self::YESTERDAY, self::TODAY, self::TOMORROW)) == 1) {
  // Do something
}

编辑实际上,你需要做的就是在你原来的尝试中替换它,它实现了同样的事情^+

$x = self::YESTERDAY + self::TODAY + self::TOMORROW;

这变成$xTRUE值的数量。所以对于布尔输出使用:

$ok = self::YESTERDAY + self::TODAY + self::TOMORROW === 1;
于 2012-01-30T11:34:57.330 回答
0

就像 devdRew 的答案的替代品一样

$x = array_count_values(array((int) self::YESTERDAY,(int) self::TODAY,(int) self::TOMORROW));
if (isset($x[1]) && $x[1] == 1) {
    echo 'Only one TRUE';
}
于 2012-01-30T11:34:37.797 回答
0

您可以遍历变量列表并在发现第二个布尔值为真时中断:

$moreThanOneTrue=false;
$oneTrue;
foreach ($BOOL_VAR_ARRAY as $bool) {
    if ($bool) {
        if($oneTrue) {
            $moreThanOneTrue=true;
            break;
        }
        $oneTrue=true;
    }
}

像这样,当您有三个以上的变量时,它会更方便。

于 2012-01-30T11:38:17.537 回答
0

当且仅当一个为真而其他为假时,x 才会返回真。

$x = ($a && !($b || $c)) || ($b && !($a || $c)) || ($c && !($a || $b));

可能是一个糟糕的代码,但有效。

于 2012-01-30T11:42:17.877 回答
0

a ^ b ^ c ^ (a & b & c)是您要查找的表达式。

于 2014-09-22T12:01:38.970 回答