确保给定列表中只有一个布尔值是真的吗?

时间:2012-01-30 11:28:13

标签: php xor boolean-logic boolean-operations

如果我有以下布尔值

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

我可以编写哪些代码以确保其中一个是真的?

我试过这个:

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

问题在于,将所有三个常量设置为true,然后$xtrue

6 个答案:

答案 0 :(得分:9)

$x = ((int) self::YESTERDAY) + ((int) self::TODAY) + ((int) self::TOMORROW);然后,如果$x === 1;你已经得到了所需的东西。

<强>编辑:

即使没有类型转换(int),由于@DaveRandom,它运行良好,所以:

if (self::YESTERDAY + self::TODAY + self::TOMORROW == 1) {},就我而言。

答案 1 :(得分:3)

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

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

编辑实际上,您需要做的就是在原始尝试中将^替换为+,并实现相同的目标:

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

这会将$x转换为TRUE个值。所以对于布尔输出使用:

$ok = self::YESTERDAY + self::TODAY + self::TOMORROW === 1;

答案 2 :(得分: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';
}

答案 3 :(得分:0)

当您找到第二个布尔值为true时,您可以循环遍历变量列表并中断:

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

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

答案 4 :(得分:0)

当且仅当一个为真且其他为假时,

x将返回true。

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

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

答案 5 :(得分:0)

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

相关问题