60

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

例如:

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

如果数组中的每个值都等于,'true'那么我想 echo 'all true'。如果数组中的任何值等于,'false'那么我想回显'some false'

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

4

8 回答 8

130

所有值都等于测试值:

// note, "count(array_flip($allvalues))" is a tricky but very fast way to count the unique values.
// "end($allvalues)" is a way to get an arbitrary value from an array without needing to know a valid array key. For example, assuming $allvalues[0] exists may not be true.
if (count(array_flip($allvalues)) === 1 && end($allvalues) === 'true') {


}

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

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

}

如果您确定数组中只有 2 个可能的值,则首选后一种方法,因为它更有效。但如果有疑问,慢程序总比错误程序好,所以使用第一种方法。

如果你不能使用第二种方法,你的数组非常大,而且数组的内容很可能有超过 1 个值(特别是如果第 2 个值很可能出现在数组开头附近),它可能执行以下操作要快得多

/**
 * Checks if an array contains at most 1 distinct value.
 * Optionally, restrict what the 1 distinct value is permitted to be via
 * a user supplied testValue.
 *
 * @param array $arr - Array to check
 * @param null $testValue - Optional value to restrict which distinct value the array is permitted to contain.
 * @return bool - false if the array contains more than 1 distinct value, or contains a value other than your supplied testValue.
 * @assert isHomogenous([]) === true
 * @assert isHomogenous([], 2) === true
 * @assert isHomogenous([2]) === true
 * @assert isHomogenous([2, 3]) === false
 * @assert isHomogenous([2, 2]) === true
 * @assert isHomogenous([2, 2], 2) === true
 * @assert isHomogenous([2, 2], 3) === false
 * @assert isHomogenous([2, 3], 3) === false
 * @assert isHomogenous([null, null], null) === true
 */
function isHomogenous(array $arr, $testValue = null) {
    // If they did not pass the 2nd func argument, then we will use an arbitrary value in the $arr (that happens to be the first value).
    // By using func_num_args() to test for this, we can properly support testing for an array filled with nulls, if desired.
    // ie isHomogenous([null, null], null) === true
    $testValue = func_num_args() > 1 ? $testValue : reset($arr);
    foreach ($arr as $val) {
        if ($testValue !== $val) {
            return false;
        }
    }
    return true;
}

注意:一些答案将原始问题解释为(1)如何检查所有值是否相同,而另一些答案将其解释为(2)如何检查所有值是否相同确保该值等于测试值。您选择的解决方案应该注意这个细节。

我的前 2 个解决方案回答了 #2。isHomogenous()如果您将第二个参数传递给它,我的函数会回答 #1 或 #2。

于 2012-05-12T02:50:52.020 回答
29

为什么不只是在调用后比较计数array_unique()

要检查数组中的所有元素是否相同,应该很简单:

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

无论数组中的值类型如何,这都应该有效。

于 2014-10-29T15:17:46.213 回答
17

此外,如果它不是二进制文件,您可以压缩山羊的答案:

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

if (array_unique($allvalues) === array('foobar')) { 
   // all values in array are "foobar"
}
于 2015-02-05T22:43:17.213 回答
15

如果您的数组包含实际的布尔值(或整数)而不是字符串,您可以使用array_sum

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

http://codepad.org/FIgomd9X

这是有效的,因为TRUE将被评估为 1FALSEas 0

于 2012-05-12T02:55:06.247 回答
5

您可以比较最小值和最大值...不是最快的方法;p

$homogenous = ( min($array) === max($array) );
于 2017-05-25T12:05:39.740 回答
0
$alltrue = 1;
foreach($array as $item) {
    if($item!='true') { $alltrue = 0; }
}
if($alltrue) { echo("all true."); }
else { echo("some false."); }

从技术上讲,这不会测试“某些错误”,而是测试“并非全部正确”。但听起来你很确定你会得到的唯一值是“真”和“假”。

于 2012-05-12T02:53:21.913 回答
0

另外一个选项:

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

用法:

same(array(true, true, true)); // => true
于 2014-01-23T22:07:17.793 回答
-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
}
于 2012-05-12T02:54:59.893 回答