如果我有以下布尔值
const YESTERDAY = false;
const TODAY = true;
const TOMORROW = false;
我可以编写什么代码来确保其中一个是真的?
我试过这个:
$x = self::YESTERDAY ^ self::TODAY ^ self::TOMORROW;
问题是所有三个常量都设置为true
then 。$x
true
如果我有以下布尔值
const YESTERDAY = false;
const TODAY = true;
const TOMORROW = false;
我可以编写什么代码来确保其中一个是真的?
我试过这个:
$x = self::YESTERDAY ^ self::TODAY ^ self::TOMORROW;
问题是所有三个常量都设置为true
then 。$x
true
$x = ((int) self::YESTERDAY) + ((int) self::TODAY) + ((int) self::TOMORROW);
然后,如果$x === 1;
你有你需要的东西。
编辑:
即使没有类型转换(int)
,它也能很好地工作,这要感谢@DaveRandom,所以:
if (self::YESTERDAY + self::TODAY + self::TOMORROW == 1) {}
,至于我。
我能想到的最简洁的方法是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;
就像 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';
}
您可以遍历变量列表并在发现第二个布尔值为真时中断:
$moreThanOneTrue=false;
$oneTrue;
foreach ($BOOL_VAR_ARRAY as $bool) {
if ($bool) {
if($oneTrue) {
$moreThanOneTrue=true;
break;
}
$oneTrue=true;
}
}
像这样,当您有三个以上的变量时,它会更方便。
当且仅当一个为真而其他为假时,x 才会返回真。
$x = ($a && !($b || $c)) || ($b && !($a || $c)) || ($c && !($a || $b));
可能是一个糟糕的代码,但有效。
a ^ b ^ c ^ (a & b & c)
是您要查找的表达式。