web-dev-qa-db-ja.com

複数の値がすべてfalseまたはすべてtrueかどうかを確認します

20変数がすべてtrueであるか、または20変数がすべてfalseであるかを確認するにはどうすればよいですか?

もし可能なら本当に長いものを使わずに...

変数は実際には配列要素です:

array( 'a' => true、 'b' => true ...)

より明確にするために:

  • 配列にtrueとfalseの両方の値がある場合、何も返さない
  • 配列にtrue値しかない場合はtrueを返します
  • 配列にfalse値しかない場合はfalseを返します:)
22
sandy
if(count(array_unique($your_array)) === 1)  
  return current($your_array);

else return;
50
barfoon

in_array を使用できます

例すべての真の:

if(in_array(false, $array, true) === false){
    return true;
}
else if(in_array(true, $array, true) === false){
    return false;
}
else{
     return 'nothing';
}
20
afuzzyllama

array_productphp.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
10
lumbric

単純なループで十分です。配列が空の場合、両方の条件が満たされることに注意してください(すべて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';
4
GolezTrol

この質問は古いですが、問題ではありません。さまざまなアプローチをベンチマークしたかったのです。 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値が存在するかどうかを単にチェックします。


ランダムブール

  • in_array:10ブール= 0.16秒
  • foreach:10ブール= 0.122秒
  • array_unique:10ブール= 0.274秒
  • foreach_bin:10ブール= 0.095秒
  • in_array_bin:10ブール= 0.073秒
  • array_sum:10ブール= 0.074秒
  • array_filter:10ブール= 0.118秒

  • in_array:100ブール= 0.153秒
  • foreach:100ブール= 0.122秒
  • array_unique:100ブール= 2.3451秒
  • foreach_bin:100ブール= 0.094秒
  • in_array_bin:100ブール= 0.074秒
  • array_sum:100ブール= 0.126秒
  • array_filter:100ブール= 0.228秒

  • in_array:1000 bools = 0.154秒
  • foreach:1000ブール= 0.149秒
  • array_unique:1000ブール= 32.6659秒(!!)
  • foreach_bin:1000 bools = 0.075秒
  • in_array_bin:1000 bools = 0.074秒
  • array_sum:1000 bools = 0.8771秒
  • array_filter:1000 bools = 1.4021秒

最後のブール値が異なります

  • in_array:10ブール= 0.152秒
  • foreach:10ブール= 0.342秒
  • array_unique:10ブール= 0.269秒
  • foreach_bin:10ブール= 0.074秒
  • in_array_bin:10ブール= 0.076秒
  • array_sum:10ブール= 0.074秒
  • array_filter:10ブール= 0.121秒

  • in_array:100ブール= 0.159秒
  • foreach:100ブール= 2.8072秒
  • array_unique:100ブール= 2.7702秒
  • foreach_bin:100ブール= 0.074秒
  • in_array_bin:100ブール= 0.09秒
  • array_sum:100ブール= 0.118秒
  • array_filter:100ブール= 0.248秒

  • in_array:1000 bools = 0.312秒
  • foreach:1000ブール= 27.5256秒
  • array_unique:1000 bools = 42.1594秒
  • foreach_bin:1000 bools = 0.074秒
  • in_array_bin:1000ブール= 0.24秒
  • array_sum:1000ブール= 0.555秒
  • array_filter:1000ブール= 1.3601秒

そして、要約すると _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でベンチマークされているため、マイクロタイムの測定値は分量です。

4
Markus AO

ブール値のみを保存する場合は、これを使用します。

$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の恐ろしい変換ルールに従ってブール値に変換されます。

4
Karoly Horvath

さらに、特定の値に対してすべての値をチェックするために、変数(値の配列だけでなく)のリストを作成できます。

$var1 = true;
$var2 = true;
$var3 = false;

$isAllVarsTrue = !in_array(false, [$var1, $var2, $var3], true);

var_dump($isAllVarsTrue); //false
3

それらがすべて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
}
3
Marc B

Forループを使用します。すべての変数がfalseであることを確認する場合は、forループを使用できます。true要素が見つかったら、サイクルを中断できます。それ以外の場合、変数はすべてfalseです。すべての変数が真であることを確認したい場合に使用できるのと同じ方法。

1
Manlio
// 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
0
geekuality