我需要检查数组中的所有值是否相等。检查数组中的所有值是否相同
例如:
$allValues = array(
'true',
'true',
'true',
);
如果阵列中的每一个值等于'true'
然后我想回声'all true'
。如果阵列中有任何值等于'false'
那么我想回显'some false'
有关我如何做到这一点的任何想法?
我需要检查数组中的所有值是否相等。检查数组中的所有值是否相同
例如:
$allValues = array(
'true',
'true',
'true',
);
如果阵列中的每一个值等于'true'
然后我想回声'all true'
。如果阵列中有任何值等于'false'
那么我想回显'some false'
有关我如何做到这一点的任何想法?
所有的值等于测试值
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;
}
喜欢后面的部分...检查虚假而不是真实..超高效... – CodeMonkey
第二种方式很棒... –
为什么我们需要这部分? “end($ allvalues)==='true'”有人可以解释吗? – Tebe
$alltrue = 1;
foreach($array as $item) {
if($item!='true') { $alltrue = 0; }
}
if($alltrue) { echo("all true."); }
else { echo("some false."); }
从技术上讲,这并不测试“一些虚假的,”它测试但是这听起来像是你很确定你会得到的唯一值是'真'和'假'。
$x = 0;
foreach ($allvalues as $a) {
if ($a != $checkvalue) {
$x = 1;
}
}
//then check against $x
if ($x != 0) {
//not all values are the same
}
如果阵列中含有的字符串而不是实际的布尔值(或整数),你可以使用array_sum
:
$allvalues = array(TRUE, TRUE, TRUE);
if(array_sum($allvalues) == count($allvalues)) {
echo 'all true';
} else {
echo 'some false';
}
这工作,因为TRUE
会1
进行评估,并FALSE
如0
。
另一种选择:
function same($arr) {
return $arr === array_filter($arr, function ($element) use ($arr) {
return ($element === $arr[0]);
});
}
用法:
same(array(true, true, true)); // => true
为什么不打电话比较后array_unique()
计数?
要检查阵列中的所有元素是相同的,应该是简单:
$allValuesAreTheSame = (count(array_unique($allvalues)) === 1);
这应该不管工作值的数组中的类型。
此外,您还可以凝结在事件山羊的答案它不是一个二进制:
if (count(array_unique($allvalues)) === 1 && end($allvalues) === 'true') {
// ...
}
到
if (array_unique($allvalues) === array('foobar')) {
// all values in array are "foobar"
}
您可以比较最小和最大...不是最快的方法,P
$homogenous = (min($array) === max($array));
这些值是如何进入数组的?为什么不用一个简单的等式来检查它们,因为它们被转移到数组上,并且不需要任何* post-facto *检查(因此,这个问题)。如果它们来自数据库,则可以在SQL端处理此操作。 – rdlowrey