2012-05-12 96 views
34

我需要检查数组中的所有值是否相等。检查数组中的所有值是否相同

例如:

$allValues = array(
    'true', 
    'true', 
    'true', 
); 

如果阵列中的每一个值等于'true'然后我想回声'all true'。如果阵列中有任何值等于'false'那么我想回显'some false'

有关我如何做到这一点的任何想法?

+0

这些值是如何进入数组的?为什么不用一个简单的等式来检查它们,因为它们被转移到数组上,并且不需要任何* post-facto *检查(因此,这个问题)。如果它们来自数据库,则可以在SQL端处理此操作。 – rdlowrey

回答

84

所有的值等于测试值

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') { 


} 

或只是测试你不想要的东西的存在。

if (in_array('false', $allvalues, true)) { 

} 

如果您确定阵列中只有2个可能的值,那么选择后一种方法会更有效。但是如果有疑问,慢程序比不正确的程序要好,所以使用第一种方法。

如果您不能使用第二种方法,你的阵列是非常大的,和数组的内容是可能有超过1倍的值(尤其是如果该值可能是附近的开始出现阵列),也可能是更快地执行以下操作:“不是所有的真正的”

function isHomogenous($arr) { 
    $firstValue = current($arr); 
    foreach ($arr as $val) { 
     if ($firstValue !== $val) { 
      return false; 
     } 
    } 
    return true; 
} 
+6

喜欢后面的部分...检查虚假而不是真实..超高效... – CodeMonkey

+0

第二种方式很棒... –

+2

为什么我们需要这部分? “end($ allvalues)==='true'”有人可以解释吗? – Tebe

0
$alltrue = 1; 
foreach($array as $item) { 
    if($item!='true') { $alltrue = 0; } 
} 
if($alltrue) { echo("all true."); } 
else { echo("some false."); } 

从技术上讲,这并不测试“一些虚假的,”它测试但是这听起来像是你很确定你会得到的唯一值是'真'和'假'。

-2
$x = 0; 
foreach ($allvalues as $a) { 
    if ($a != $checkvalue) { 
     $x = 1; 
    } 
} 

//then check against $x 
if ($x != 0) { 
    //not all values are the same 
} 
9

如果阵列中含有的字符串而不是实际的布尔值(或整数),你可以使用array_sum

$allvalues = array(TRUE, TRUE, TRUE); 
if(array_sum($allvalues) == count($allvalues)) { 
    echo 'all true'; 
} else { 
    echo 'some false'; 
} 

http://codepad.org/FIgomd9X

这工作,因为TRUE1进行评估,并FALSE0

0

另一种选择:

function same($arr) { 
    return $arr === array_filter($arr, function ($element) use ($arr) { 
     return ($element === $arr[0]); 
    }); 
} 

用法:

same(array(true, true, true)); // => true 
5

为什么不打电话比较后array_unique()计数?

要检查阵列中的所有元素是相同的,应该是简单:

$allValuesAreTheSame = (count(array_unique($allvalues)) === 1); 

这应该不管工作值的数组中的类型。

+0

因为“count(array_unique”返回1 – Andrew

+0

'1'只会在输入数组中只有一个唯一值时被返回,'array_unique()'函数“输入数组并返回一个没有重复值的新数组“ – Werner

+0

如果数组中的所有值都相同,则返回1,如果我有数组(5,5,5),它将返回数组(5)并进行比较您的代码会产生错误的结果 – Andrew

6

此外,您还可以凝结在事件山羊的答案它不是一个二进制:

if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') { 
    // ... 
} 

if (array_unique($allvalues) === array('foobar')) { 
    // all values in array are "foobar" 
} 
1

您可以比较最小和最大...不是最快的方法,P

$homogenous = (min($array) === max($array)); 
相关问题