Php 检查多个值是否全部为假或全部为真

Php 检查多个值是否全部为假或全部为真,php,conditional,boolean,conditional-statements,boolean-logic,Php,Conditional,Boolean,Conditional Statements,Boolean Logic,如何检查20个变量是否全部为真,或者20个变量是否全部为假 如果可能,不使用很长的if 变量实际上是数组元素: 数组('a'=>true,'b'=>true…) 更清楚地说: 如果数组同时具有true和false值,则不返回任何内容 如果数组只有true值,则返回true 如果数组只有false值,则返回false :) 使用for循环。如果要检查所有变量是否为false,可以使用for循环:一旦找到true元素,就可以中断循环,否则变量都为false。如果要检查所有变量是否为真,可以使用相同

如何检查20个变量是否全部为真,或者20个变量是否全部为假

如果可能,不使用很长的if

变量实际上是数组元素:

数组('a'=>true,'b'=>true…)

更清楚地说:

  • 如果数组同时具有true和false值,则不返回任何内容
  • 如果数组只有true值,则返回true
  • 如果数组只有false值,则返回false :)

使用for循环。如果要检查所有变量是否为false,可以使用for循环:一旦找到true元素,就可以中断循环,否则变量都为false。如果要检查所有变量是否为真,可以使用相同的方法。

如果只存储布尔值,请使用以下方法:

$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转换规则转换为布尔值。

如果它们都是数组元素,具有真/假值,则使用array\u flip()

$new=array\u flip($array);
如果(!isset($array[false])&&isset($array[true])){
…没有假值,至少有一个真值
}

对于大型阵列来说,这可能会很昂贵,因此您可能需要尝试
array\u unique()
。您将得到一个最多有两个值(一个为真,一个为假)的数组


好吧,那就不行了。简单鸟枪法:

if (in_array($yourarray, false, TRUE)) {
   ... at least one non-true value
}
你可以用

例如,对于所有真实情况:

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

一个简单的循环就可以了。请注意,如果数组为空,则两个条件都满足(全部为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';

可以使用
array\u产品
,如下所示:


这个问题由来已久,但无关紧要。我想对不同的方法进行基准测试。
in_array()
方法性能最好,因为它可能不需要遍历整个数组。(最后只有一个唯一的布尔值的可能性很低,但即使这样,它的性能也很好。)

这里没有提到的一种方法是
array\u sum($array)
,如果所有值都是
false
,则返回
0
,如果某处有
true
值,则返回
1+
。与
array\u filter
方法类似,它不会告诉您两者是否都存在,但有助于确定是否存在
true
。我还添加了一个基本的
foreach
检查是否混合或全部为真/假,以及一个
in_array
中的
,它只检查任何东西是否为
true
(如下所示)

以下是基准。每种情况用10、100或1000个随机布尔数组迭代100000次;同样是9、99和999个相同的布尔值,最后一个布尔值是唯一的(以便在_数组中有完整的
迭代时间)。测试的前三个检查生成请求的
true/false/两者
结果,其余四个检查是否存在
true


随机布尔
  • 在_阵列中:10布尔=0.16秒
  • foreach:10 bools=0.122秒
  • 阵列_unique:10布尔=0.274秒
  • foreach_bin:10 bools=0.095秒
  • 在数组中\u bin:10个布尔值=0.073秒
  • 数组_和:10布尔=0.074秒
  • 阵列过滤器:10 bools=0.118秒

  • 在_数组中:100布尔=0.153秒
  • foreach:100 bools=0.122秒
  • 阵列_unique:100布尔=2.3451秒
  • foreach_bin:100 bools=0.094秒
  • 在数组中\u bin:100布尔=0.074秒
  • 数组_和:100布尔=0.126秒
  • 阵列_过滤器:100布尔=0.228秒

  • 在_数组中:1000布尔=0.154秒
  • foreach:1000 bools=0.149秒
  • 阵列_unique:1000 bools=32.6659秒(!!)
  • foreach_bin:1000 bools=0.075秒
  • 阵列中的存储箱:1000 bools=0.074秒
  • 数组_和:1000布尔=0.8771秒
  • 阵列过滤器:1000布尔=1.4021秒

最后一个布尔值不同
  • 在_数组中:10布尔=0.152秒
  • foreach:10 bools=0.342秒
  • 阵列_unique:10 bools=0.269秒
  • foreach_bin:10 bools=0.074秒
  • 在数组中\u bin:10个布尔值=0.076秒
  • 数组_和:10布尔=0.074秒
  • 阵列过滤器:10布尔=0.121秒

  • 在_数组中:100布尔=0.159秒
  • foreach:100 bools=2.8072秒
  • 阵列_unique:100 bools=2.7702秒
  • foreach_bin:100 bools=0.074秒
  • 在数组中\u bin:100 bools=0.09秒
  • 数组_sum:100布尔=0.118秒
  • 阵列过滤器:100布尔=0.248秒

  • 在_数组中:1000布尔=0.312秒
  • foreach:1000 bools=27.5256秒
  • 阵列_unique:1000布尔=42.1594秒
  • foreach_bin:1000 bools=0.074秒
  • 在数组中\u bin:1000 bools=0.24秒
  • 数组_sum:1000布尔=0.555秒
  • 阵列过滤器:1000布尔=1.3601秒

那么,总而言之。独特的
array_
方式显然占据了主导地位,不要用于大型阵列或大量阵列!foreach的
方式比数组中的
稍有优势,但遗憾的是,代码没有那么优雅
if(in_array(false, $array, true) === false){
    return true;
}
else if(in_array(true, $array, true) === false){
    return false;
}
else{
     return 'nothing';
}
// 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';
$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
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'; // =^_^=
    }
}
$var1 = true;
$var2 = true;
$var3 = false;

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

var_dump($isAllVarsTrue); //false