2012-01-30 8 views
8

私は必ず正確に一つが真であることを確認するために書くことができますどのようなコードを以下のブール指定されたリストの1つのブール値が真であることを確認してください。

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

を持っている場合は?

私はこれを試してみた:

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

問題は、すべての3つの定数は、その後trueに設定して$xtrueであるということです。

+0

OR条件(YESTERDAY =真AND TODAY =偽AND TOMORROW =偽)または(YESTERDAY =偽AND TODAY =真AND TOMORROW =偽)または(YESTERDAY =偽AND TODAY =偽AND TOMORROW = true) ' –

+0

彼は真実が偽証であることを確かめる必要があります。少なくとも一つではありません。 – devdRew

答えて

8

$x = ((int) self::YESTERDAY) + ((int) self::TODAY) + ((int) self::TOMORROW); then $x === 1;あなたは必要なものを手に入れました。

EDITED:でもタイプなし

ので、@DaveRandomに、それがうまく機能し、感謝を(int)をキャスト:

if (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'; 
} 
+0

私はこれについて考えましたが、余分な処理をすべて避けるのがいいでしょう。ビット単位でこれを行う方法はありますか? – Matthew

+0

+1これはテスト後に '(int)'キャストが必要ないと思われますが、それは暗黙的に起こります。 – DaveRandom

+1

これは、他のソリューションよりもはるかに整っています。@MattはXOR(^)演算子を使用するとほぼ正しいですが、残念ながら 'true^true^true'は' true'と評価されます。 ' – WildlyInaccurate

0

私は考えることができるneatest方法はarray_sum()です:

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

EDIT実は、あなたがそれを行うために必要なすべてがで^を置き換えます+を元の手順で実行し、同じことを実現します。

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

これはの値に$xを変換します。だから、ブール出力用:あなたが真である第二ブール見つけたとき

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

の代替として

+0

これはかなりきれいです! – Matthew

+0

実際にはdevdRewの答えのバリエーションは一番です - 元のコードで '^'を '+'に置き換えると同じことが行われます。暗黙的に起こるので、 '(int)'キャストは必要ありません。 – DaveRandom

+0

それはもっときれいです! – Matthew

0

あなたはあなたの変数のリストをループして破ることができます。このよう

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

をあなたが持っているとき、それはより便利です3つ以上の変数。

+0

3より大きい場合は、 'array_sum'メソッドがこれよりも簡単になると思います。 – Matthew

+0

@Matt:私は同意します。 – ezdazuzena

0

xは、一方が真、他方が偽である場合にのみtrueを返します。

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

悪いコードかもしれませんが、動作します。

0

a^b^c^(a & b & c)あなたが期待する表現です。

関連する問題