我需要检查数组中的所有值是否相同。
例如:
$allValues = array(
'true',
'true',
'true',
);
如果数组中的每个值都等于'true'
,那么我想回显'all true'
。如果数组中的任何值等于'false'
,那么我想回显'some false'
我对如何做到这一点有任何想法?
答案 0 :(得分:107)
所有值都等于测试值:
if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') {
}
或只是测试你不想要的东西的存在:
if (in_array('false', $allvalues, true)) {
}
如果您确定阵列中只有2个可能的值,则更喜欢后一种方法,因为它更有效。但如果有疑问,慢程序比不正确的程序更好,所以使用第一种方法。
如果你不能使用第二种方法,你的数组非常大,并且数组的内容可能具有多于1的值(特别是如果该值可能发生在附近)在数组的开头),执行以下操作可能很多:
function isHomogenous($arr) {
$someValue = current($arr);
foreach ($arr as $val) {
if ($someValue !== $val) {
return false;
}
}
return true;
}
注意:有些答案将原始问题解释为(1)如何检查所有值是否相同,而其他答案则将其解释为(2)如何检查所有值是否相同< strong>和确保该值等于测试值。您选择的解决方案应该注意这一细节。
我的前2个解决方案回答了#2。我的isHomogenous()
函数回答#1,虽然您可以通过传递$firstValue
的值作为测试值来修改它来回答#2,而不是像我那样使用数组中找到的第一个值。
答案 1 :(得分:12)
如果您的数组包含实际的布尔值(或整数)而非字符串,则可以使用array_sum
:
$allvalues = array(TRUE, TRUE, TRUE);
if(array_sum($allvalues) == count($allvalues)) {
echo 'all true';
} else {
echo 'some false';
}
这是有效的,因为TRUE
将被评估为1
,而FALSE
将被评估为0
。
答案 2 :(得分:10)
另外,如果山羊的答案不是二元的话,你可以压缩山羊的答案:
if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') {
// ...
}
到
if (array_unique($allvalues) === array('foobar')) {
// all values in array are "foobar"
}
答案 3 :(得分:7)
为什么不在调用array_unique()
后比较计数?
要检查数组中的所有元素是否相同,应该如下所示:
$allValuesAreTheSame = (count(array_unique($allvalues)) === 1);
无论数组中的值类型如何,这都应该有效。
答案 4 :(得分:4)
你可以比较最小和最大......不是最快的方法; p
$homogenous = ( min($array) === max($array) );
答案 5 :(得分:0)
$alltrue = 1;
foreach($array as $item) {
if($item!='true') { $alltrue = 0; }
}
if($alltrue) { echo("all true."); }
else { echo("some false."); }
从技术上讲,这不会测试“某些错误”,它会测试“并非所有都是真的”。但听起来你很确定你得到的唯一价值是“真实”和“虚假”。
答案 6 :(得分:0)
另一种选择:
function same($arr) {
return $arr === array_filter($arr, function ($element) use ($arr) {
return ($element === $arr[0]);
});
}
用法:
same(array(true, true, true)); // => true
答案 7 :(得分:-3)
$x = 0;
foreach ($allvalues as $a) {
if ($a != $checkvalue) {
$x = 1;
}
}
//then check against $x
if ($x != 0) {
//not all values are the same
}