Check if all values in array are the same

2020-01-29 05:00发布

I need to check if all values in an array equal the same thing.

For example:

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

If every value in the array equals 'true' then I want to echo 'all true'. If any value in the array equals 'false' then I want to echo 'some false'

Any idea on how I can do this?

标签: php arrays
8条回答
Viruses.
2楼-- · 2020-01-29 05:36

If your array contains actual booleans (or ints) instead of strings, you could use array_sum:

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

http://codepad.org/FIgomd9X

This works because TRUE will be evaluated as 1, and FALSE as 0.

查看更多
手持菜刀,她持情操
3楼-- · 2020-01-29 05:36
$alltrue = 1;
foreach($array as $item) {
    if($item!='true') { $alltrue = 0; }
}
if($alltrue) { echo("all true."); }
else { echo("some false."); }

Technically this doesn't test for "some false," it tests for "not all true." But it sounds like you're pretty sure that the only values you'll get are 'true' and 'false'.

查看更多
混吃等死
4楼-- · 2020-01-29 05:40

All values equal the test value:

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


}

or just test for the existence of the thing you don't want:

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

}

Prefer the latter method if you're sure that there's only 2 possible values that could be in the array, as it's much more efficient. But if in doubt, a slow program is better than an incorrect program, so use the first method.

If you can't use the second method, your array is very large, and the contents of the array is likely to have more than 1 value (especially if the value is likely to occur near the beginning of the array), it may be much faster to do the following:

/**
 * @param array $arr
 * @param null  $testValue
 * @return bool
 * @assert isHomogenous([]) === true
 * @assert isHomogenous([2]) === true
 * @assert isHomogenous([2, 2]) === true
 * @assert isHomogenous([2, 2], 2) === true
 * @assert isHomogenous([2, 2], 3) === false
 * @assert isHomogenous([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.
    // 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 : current($arr);
    foreach ($arr as $val) {
        if ($testValue !== $val) {
            return false;
        }
    }
    return true;
}

Note: Some answers interpret the original question as (1) how to check if all values are the same, while others interpreted it as (2) how to check if all values are the same and make sure that value equals the test value. The solution you choose should be mindful of that detail.

My first 2 solutions answered #2. My isHomogenous() function answers #1, or #2 if you pass it the 2nd arg.

查看更多
不美不萌又怎样
5楼-- · 2020-01-29 05:41

Another option:

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

Usage:

same(array(true, true, true)); // => true
查看更多
家丑人穷心不美
6楼-- · 2020-01-29 05:42

Also, you can condense goat's answer in the event it's not a binary:

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

to

if (array_unique($allvalues) === array('foobar')) { 
   // all values in array are "foobar"
}
查看更多
Ridiculous、
7楼-- · 2020-01-29 05:42
$x = 0;
foreach ($allvalues as $a) {
   if ($a != $checkvalue) {
      $x = 1;
   }
}

//then check against $x
if ($x != 0) {
   //not all values are the same
}
查看更多
登录 后发表回答