Подтвердить что ты не робот

Проверьте, одинаковы ли все значения в массиве

Мне нужно проверить, равны ли все значения в массиве одинаковыми.

Например:

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

Если каждое значение в массиве равно 'true', тогда я хочу эхо 'all true'. Если любое значение в массиве равно 'false', тогда я хочу эхо 'some false'

Любая идея о том, как я могу это сделать?

4b9b3361

Ответ 1

Все значения равны тестовому значению:

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) как проверить, все ли значения одинаковы, и убедитесь, что это значение равно тестовому значению. Решение, которое вы выбираете, должно учитывать эту деталь.

Мои первые 2 решения ответили # 2. Моя isHomogenous() отвечает на # 1, хотя вы можете изменить ее, чтобы она отвечала на # 2, передав значение $firstValue в качестве тестового значения вместо использования первого значения, найденного в массиве, как я.

Ответ 2

Если ваш массив содержит фактические логические значения (или 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 будет оцениваться как 1 и FALSE как 0.

Ответ 3

Кроме того, вы можете конденсировать ответ козла в случае, если он не является двоичным:

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

к

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

Ответ 4

Почему бы просто не сравнить счетчик после вызова array_unique()?

Чтобы проверить, все ли элементы в массиве одинаковы, должно быть так же просто, как:

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

Это должно работать независимо от типа значений в массиве.

Ответ 5

Вы можете сравнить min и max... не самый быстрый способ: p

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

Ответ 6

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

Технически это не проверяет "какое-то ложное", оно проверяет "не все верно". Но похоже, что вы уверены, что единственные ценности, которые вы получите, - это "истина" и "ложь".

Ответ 7

Другая опция:

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

Использование:

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

Ответ 8

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

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