14

我有一个关联数组,我需要在其中计算布尔真值的数量。

最终结果是创建一个 if 语句,当数组中仅存在一个真值时,该语句将返回真。如果数组中有多个真值,或者数组中没有真值,则需要返回 false。

我知道最好的方法是以某种形式使用 count 和 in_array 。我不确定这是否可行,只是在我的脑海中,但即使它确实如此,这是最好的方法吗?

$array(a->true,b->false,c->true)    

if (count(in_array(true,$array,true)) == 1)
{
    return true
}
else
{
    return false
}
4

5 回答 5

44

我会使用array_filter。

$array = array(true, true, false, false);
echo count(array_filter($array));
//outputs: 2

http://codepad.viper-7.com/ntmPVY

Array_filter将删除 false-y (value == false) 的值。那就来数一数吧。如果您需要基于某些特殊值进行过滤,例如,如果您正在寻找特定值,array_filter 接受一个可选的第二个参数,该参数是您可以定义返回值是 true(未过滤)还是 false(过滤掉)。

于 2013-05-07T21:16:39.830 回答
12

由于 TRUE 被强制转换为 1,而 FALSE 被强制转换为 0。您也可以使用array_sum

$array = array('a'=>true,'b'=>false,'c'=>true);
if(array_sum($array) == 1) {
    //one and only one true in the array
}

来自文档:“FALSE 将产生 0(零),TRUE 将产生 1(一)。”

于 2013-05-07T22:16:14.433 回答
3

试试这种方法:

<?php
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));
?>

结果 :

Array
(
   [1] => 2
   [hello] => 2
   [world] => 1
)

文档

于 2013-05-07T21:19:47.917 回答
0

像这样?

$trues = 0;
foreach((array)$array as $arr) {
   $trues += ($arr ? 1 : 0);
}
return ($trues==1);
于 2013-05-07T21:17:49.423 回答
0

您是否尝试过使用array_count_values来获得一个包含所有内容的数组?然后检查有多少是真的?

于 2013-05-07T21:19:49.883 回答