2016-10-13 5 views
5

与えられた条件数のうち複数ではありませんか?PHP - 指定された条件数に複数の条件が満たされているかどうかをチェック

たとえば、私には3つの変数、$ a、$ b、および$ cがあります。 これらのうちの2つが真であることを確認したいと思います。だから、次は渡す:

$a = true; 
$b = false; 
$c = true; 

しかし、これはないだろう:

$a = false; 
$b = false; 
$c = true; 

また、私は7つの条件のうち4は、例えば、本当だったかどうかを確認することをお勧めします。

私はそれぞれの組み合わせを確認できますが、条件の数が増えるにつれてこれは難しくなります。条件をループし、集計を維持することが私が考えることができる最良の選択ですが、これを行うための別の方法があると考えました。

ありがとうございます!

編集:すべての偉大な答えをありがとう、彼らは非常に感謝しています。 スパナを作品に投げ込むだけで、変数が明白なブール値でない場合はどうなりますか? など。

($a == 2) 
($b != "cheese") 
($c !== false) 
($d instanceof SomeClass) 
+0

は「あなたがしたいですか1つ以上、「すべてではない」、または「正確にxをyから」したいですか? – Erik

+0

変数の数はありますか?例えば最初のケースは3、2番目のケースは7です。 –

+0

私はさまざまな状況に柔軟に対応できるソリューションを探しています。理想的には、範囲のオプション(すなわち、7のうち2と4との間の範囲)を有する解決策は素晴らしいものとなる。しかし、それは "2と2の間"と言うことができます。つまり、正確には2つです。 –

答えて

8

A "true" boolean in PHP casts to a 1 as an integer, and "false" casts to 0。したがって:

echo $a + $b +$c; 

... 3つのブール変数$a$bまたは$cのうち2に該当する場合の意志出力2。 (値を追加すると、暗黙的に整数に変換されます。)これもarray_sum()のような機能で動作します

ので、例えば:

echo array_sum([true == false, 'cheese' == 'cheese', 5 == 5, 'moon' == 'green cheese']); 

...意志出力2

+0

これは正しい答えです。 – Tigger

+0

同じ方法で動作しますか: ($ a == 2)+($ b!= "cheese")+($ c!== false)? –

+1

はい、それぞれのテストで 'true'または' false'が返されます – Tigger

1

私は次のような方法のために行くだろう:

それは言う
if (evaluate(a, b, c)) 
{ 
    do stuff; 
} 

boolean evaluate(boolean a, boolean b, boolean c) 
{ 
    return a ? (b || c) : (b && c); 
} 

  • Trueの場合は、BまたはCのいずれかが真でなければならないが2/3 真の基準にも準拠しています。
  • そうでなければ、bとcの両方が真でなければなりません!

あなたは、私は次のようなソリューションのために行くだろう条件や変数の数を拡大し、カスタマイズしたい場合は、次の

$a = true; 
$b = true; 
$c = true; 
$d = false; 
$e = false; 
$f = true; 

$condition = 4/7; 

$bools = array($a, $b, $c, $d, $e, $f); 

$eval = count(array_filter($bools))/sizeof($bools); 

print_r($eval/$condition >= 1 ? true : false); 

だけで、我々は真のを評価し、我々がいることを確認してくださいTrueの%は等しいか、達成したいものより優れています。同様に、最終的な評価式を操作して、必要なものを達成することもできます。私はあなたが演算子「&」を使用する場合、それは少し簡単かつ短い書き込みだと思う

$a = true; 
$b = false; 
$c = true; 

if (count(array_filter(array($a, $b, $c))) == 2) { 
    echo "Success"; 
}; 
+0

これはOPごとにどのように7のうち4つで動作しますか? – Tigger

+0

私は「7のうち4」をあまり得ていませんでした。彼は7のうち4つのブール表現を意味しますか? –

+0

@Manos、それは本当にいいです。 – Blinkydamo

4

あなたは配列にあなたの変数を入れて、真の値の数を確認するためにarray_filter()count()を使用することができます、 "|"このように:

$a = true; 
$b = true; 
$c = false; 

$isTrue = $a&$b | $b&$c | $c&$a; 

print_r($isTrue); 

あなたの自己で確認してみましょう:D

+1

すべての変数はOPに従って「真」であってはなりません。 @ AlokPatel Gotcha。 –

+0

更新しました。 –

+0

array_filterのカウントに '||'を追加する必要があるかもしれません。これは2以上でなければならず、すべての変数の合計であってはなりません。 –

0

ループしながら、Uを使用することができます。

$condition_n = "x number"; // number of required true conditions 
$conditions = "x number"; // number of conditions 
$loop = "1"; 
$condition = "0"; 

while($loop <= $conditions) 
{ 
// check if condition is true 
// if condition is true : $condition = $condition + 1; 
// $loop = $loop + 1; 
} 
if($condition >= $condition_n) 
{ 
// conditions is True 
} 
else 
{ 
// conditions is false 
} 
+0

これは私が提案したループの一種です –

+0

これはうまくいきました:p – Soheyl

1

は、これも動作するはずですし、かなり簡単にあなたが数字に調整することができるようになります。

$a = array('soap','soap'); 
$b = array('cake','sponge'); 
$c = array(true,true); 
$d = array(5,5); 
$e = false; 
$f = array(true,true); 
$g = array(false,true); 
$pass = 4; 
$ar = array($a,$b,$c,$d,$e,$f,$g); 

var_dump(trueornot($ar,$pass)); 

function trueornot($number,$pass = 2){ 
    $store = array(); 
    foreach($number as $test){ 
     if(is_array($test)){ 
      if($test[0] === $test[1]){ 
       $store[] = 1; 
      } 
     }else{ 
      if(!empty($test)){ 
       $store[] = 1; 
      } 
     }  
     if(count($store) >= $pass){ 
      return TRUE;  
     } 
    } 
    return false; 
} 
+0

おかげで、ブーリアン変数だけに見えますが、他のタイプの変数には微調整が必​​要です。 –

+0

@SixTicksLimited – Epodax

関連する問題