Php 检查多个值是否全部为假或全部为真
如何检查20个变量是否全部为真,或者20个变量是否全部为假 如果可能,不使用很长的if 变量实际上是数组元素: 数组('a'=>true,'b'=>true…) 更清楚地说: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。如果要检查所有变量是否为真,可以使用相同
- 如果数组同时具有true和false值,则不返回任何内容
- 如果数组只有true值,则返回true
- 如果数组只有false值,则返回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