php 检查数组中的所有值是否相同

7rfyedvj  于 2022-12-28  发布在  PHP
关注(0)|答案(9)|浏览(136)

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

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

如果数组中的每个值都等于'true',那么我需要回显'all true'。如果数组中的任何值都等于'false',那么我需要回显'some false'
你知道我该怎么做吗?

ttygqcqt

ttygqcqt1#

所有值均等于试验值:

// 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)) {

}

如果你确信数组中只有两个可能的值,那么就选择后一种方法,因为它效率更高。但是如果你不确定,那么一个缓慢的程序总比一个不正确的程序好,所以使用第一种方法。
如果不能使用第二种方法,您的数组非常大,并且数组的内容 * 很可能 * 具有多个值(尤其是如果第二个值很可能出现在数组开头附近),则执行以下操作可能会 * 快得多 *:

/**
 * 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。我的isHomogenous()函数的答案是#1,或者如果传递第二个arg,答案是#2。

g2ieeal7

g2ieeal72#

为什么不在调用array_unique()后比较count呢?
若要检查数组中的所有元素是否相同,应简单如以下所示:

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

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

gcxthw6b

gcxthw6b3#

另外,如果goat的答案不是二进制的,你可以将其浓缩:

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

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

8tntrjer4#

如果数组包含实际的布尔值(或int)而不是字符串,则可以使用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将被计算为1FALSE将被计算为0

pb3s4cty

pb3s4cty5#

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

$homogenous = ( min($array) === max($array) );
tpgth1q7

tpgth1q76#

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

从技术上讲,这不是测试“一些错误”,而是测试“不全正确”,但听起来你很确定你得到的值只有“正确”和“错误”。

35g0bw71

35g0bw717#

另一种选择:

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

用法:

same(array(true, true, true)); // => true
2ic8powd

2ic8powd8#

回答我的2023年的寻人方法。

$arr = [5,5,5,5,5];
$flag = 0;
$firstElement = $arr[0];

foreach($arr as $val){
    // CHECK IF THE FIRST ELEMENT DIFFERS FROM ANY OTHER ELEMENT IN THE ARRAY
    if($firstElement != $val){
        // FIRST MISMATCH FOUND. UPDATE FLAG VALUE AND BREAK OUT OF THE LOOP.
        $flag = 1;
        break;
    }
}

if($flag == 0){
    // ALL THE ELEMENTS ARE SAME... DO SOMETHING
}else{
    // ALL THE ELEMENTS ARE NOT SAME... DO SOMETHING
}

在一个所有元素都相同的数组中,所有元素都必须与数组的第一个元素匹配,这应该总是正确的。记住这个逻辑,我们可以得到数组的第一个元素,并迭代数组中的每个元素,以检查循环中的第一个元素是否与数组中的第一个元素不匹配。如果找到,我们将改变标志值并立即跳出循环。2否则,循环将继续直到结束。3稍后,在循环之外,我们可以使用这个标志值来判断数组中的所有元素是否相同。
这个解决方案对于有明确元素限制的数组(小数组)很好。但是,考虑到我们要遍历每个元素来检查第一个收支平衡点,我不确定这个解决方案对于有大量元素的数组有多好。请根据您自己的方便和判断使用这个解决方案。

hi3rlvi2

hi3rlvi29#

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

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

相关问题