20変数がすべてtrueであるか、または20変数がすべてfalseであるかを確認するにはどうすればよいですか?
もし可能なら本当に長いものを使わずに...
変数は実際には配列要素です:
array( 'a' => true、 'b' => true ...)
より明確にするために:
if(count(array_unique($your_array)) === 1)
return current($your_array);
else return;
in_array を使用できます
例すべての真の:
if(in_array(false, $array, true) === false){
return true;
}
else if(in_array(true, $array, true) === false){
return false;
}
else{
return 'nothing';
}
array_product
php.netのコメントに示されているように :
$check[] = boolval(TRUE);
$check[] = boolval(1);
$check[] = boolval(FALSE);
$check[] = boolval(0);
$result = (bool) array_product($check);
// $result is set to FALSE because only two of the four values evaluated to TRUE
単純なループで十分です。配列が空の場合、両方の条件が満たされることに注意してください(すべてfalseですべてtrue)。他の理由により、これは結果に表示されませんが、これをどのように処理するかを自分で見つけることができます。
// Input
$x = array ('a'=>false, 'b'=>false, 'c'=>false);
// Initialization
$anytrue = false;
$alltrue = true;
// Processing
foreach($x as $k=>$v)
{
$anytrue |= $v;
$alltrue &= $v;
}
// Display result
if ($alltrue)
echo 'All elements are true';
elseif (!$anytrue)
echo 'All elements are false';
else
echo 'Mixed values';
この質問は古いですが、問題ではありません。さまざまなアプローチをベンチマークしたかったのです。 in_array()
メソッドは、おそらく配列全体を反復処理する必要がないため、最高のパフォーマンスを発揮します。 (あなたが持っている確率は低いですが、最後に1つのユニークなブール値ですが、それでもそれはうまくいきます。)
ここで言及されていないアプローチの1つはarray_sum($array)
で、すべての値がfalse
の場合は_0
_を返し、どこかにtrue
の値がある場合は_1+
_を返します。 _array_filter
_のアプローチと同様に、両方が存在するかどうかはわかりませんが、true
があるかどうかを調べるのに役立ちます。また、基本的なforeach
チェックに混合またはすべてのtrue/falseのチェックを追加し、_in_array
_にtrue
があるかどうかだけをチェックします(以下の_*_bin
_として)。
だからここにベンチマークがあります。各ケースは、10、100、または1000個のランダムなブール値の配列で100000回繰り返されます。また、9、99、および999の同一のブール値を使用し、最後のブール値は一意です(_in_array
_の完全な反復時間を持つため)。テストされた最初の3つのチェックは、要求された_true/false/both
_結果を生成し、残りの4つのチェックは、true
値が存在するかどうかを単にチェックします。
そして、要約すると _array_unique
_の方法は明確に末尾を保持します。大きな配列や大量の配列には使用しないでください! foreach
の方法は_in_array
_よりわずかにエッジがありますが、残念ながらコードはそれほどエレガントではありません。 _array_sum
_の方法は、より小さい(<100)配列の「trueの場合」チェックと同等です。 (私はarray_sum($array) > 0
の単純さを掘り下げています。)_array_filter
_の方法は、_in_array
_およびforeach
よりも少し遅れています。最後の値のみが異なる場合、foreach
と_array_unique
_の両方が悪い値になります。
最後に、良いユーモアのためのforeach
関数。とても読みやすい。 真実はそこにあります!
_function foreach_truth_test($array)
{
$trues = $falses = false;
foreach($array as $val) {
if ($val === true) {
$trues = true;
} elseif ($val === false) {
$falses = true;
}
if ($trues === true && $falses === true) {
return 'both'; // Enough information.
}
}
// Regular Universe
if ($trues === true && $falses === false) {
return 'true';
} // Evil Mirror Universe
elseif ($trues === false && $falses === true) {
return 'false';
} // Intergalactic Void
else {
return 'void'; // =^_^=
}
}
_
追伸上記の「null」を使用することもできますが、この方法の方が楽しいです。 Windowsでベンチマークされているため、マイクロタイムの測定値は分量です。
ブール値のみを保存する場合は、これを使用します。
$a = array('a'=> true, 'b'=> true, 'c'=>true);
$af = array_filter($a);
if ($af == $a) {
echo "all true";
}
if (empty($af)) {
echo "all false";
}
注:配列に他の値がある場合、それらはPHPの恐ろしい変換ルールに従ってブール値に変換されます。
さらに、特定の値に対してすべての値をチェックするために、変数(値の配列だけでなく)のリストを作成できます。
$var1 = true;
$var2 = true;
$var3 = false;
$isAllVarsTrue = !in_array(false, [$var1, $var2, $var3], true);
var_dump($isAllVarsTrue); //false
それらがすべてtrue/false値の配列要素である場合は、array_flip()を使用します。
$new = array_flip($array); if (!isset($array[false]) && isset($array[true])) { ... there's no false values, and at least one true value }
大きな配列の場合、これは高価になる可能性があるため、代わりにarray_unique()
を試してください。最大で2つの値(1つは真、1つは偽)を持つ配列を取得します。
OK、それではうまくいきません。シンプルなショットガンアプローチ:
if (in_array($yourarray, false, TRUE)) {
... at least one non-true value
}
Forループを使用します。すべての変数がfalseであることを確認する場合は、forループを使用できます。true要素が見つかったら、サイクルを中断できます。それ以外の場合、変数はすべてfalseです。すべての変数が真であることを確認したい場合に使用できるのと同じ方法。
// set default value
$result = false;
foreach ($array as $key => $value) {
if ($value === true) {
$result = true;
break;
}
}
// $result is now true if any value was true, otherwise it's false