如果我有以下布尔值
const YESTERDAY = false;
const TODAY = true;
const TOMORROW = false;
我可以编写哪些代码以确保其中一个是真的?
我试过这个:
$x = self::YESTERDAY ^ self::TODAY ^ self::TOMORROW;
问题在于,将所有三个常量设置为true
,然后$x
为true
。
答案 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)
是您要查找的表达式。