次のブール値がある場合
const YESTERDAY = false;
const TODAY = true;
const TOMORROW = false;
正確に 1 つが真であることを確認するには、どのコードを記述できますか?
私はこれを試しました:
$x = self::YESTERDAY ^ self::TODAY ^ self::TOMORROW;
問題は、3 つすべての定数がtrue
thenに設定されていること$x
ですtrue
。
次のブール値がある場合
const YESTERDAY = false;
const TODAY = true;
const TOMORROW = false;
正確に 1 つが真であることを確認するには、どのコードを記述できますか?
私はこれを試しました:
$x = self::YESTERDAY ^ self::TODAY ^ self::TOMORROW;
問題は、3 つすべての定数が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;
xは、1つがtrueで、他がfalseの場合にのみ、trueを返します。
$x = ($a && !($b || $c)) || ($b && !($a || $c)) || ($c && !($a || $b));
悪いコードかもしれませんが、機能します。
a ^ b ^ c ^ (a & b & c)
探している式です。
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';
}
変数のリストをループして、true である 2 番目のブール値を見つけたときにブレークできます。
$moreThanOneTrue=false;
$oneTrue;
foreach ($BOOL_VAR_ARRAY as $bool) {
if ($bool) {
if($oneTrue) {
$moreThanOneTrue=true;
break;
}
$oneTrue=true;
}
}
このように、変数が 3 つ以上ある場合は、より便利です。