8

次のブール値がある場合

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

正確に 1 つが真であることを確認するには、どのコードを記述できますか?

私はこれを試しました:

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

問題は、3 つすべての定数がtruethenに設定されていること$xですtrue

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;

これが値$xの数に変わりTRUEます。したがって、ブール出力の場合は次を使用します。

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

xは、1つがtrueで、他がfalseの場合にのみ、trueを返します。

$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 に答える
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

変数のリストをループして、true である 2 番目のブール値を見つけたときにブレークできます。

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

このように、変数が 3 つ以上ある場合は、より便利です。

于 2012-01-30T11:38:17.537 に答える