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

43

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

Например:

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

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

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

Как значения попали в массив? Почему бы не проверить их с простым равенством, поскольку они перенесены на массив, и устранить необходимость в каких-либоex post facto проверка (и тем самым этот вопрос). Если они поступают из базы данных, эту операцию можно выполнить на стороне SQL. rdlowrey

Ваш Ответ

8   ответов
-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
}
11

числа) вместо строк, вы можете использовать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.

6

array_unique()?

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1Error: User Rate Limit Exceededarray_unique()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0
$alltrue = 1;
foreach($array as $item) {
    if($item!='true') { $alltrue = 0; }
}
if($alltrue) { echo("all true."); }
else { echo("some false."); }

яет на "не все верно". Но это звучит так, как будто вы уверены, что единственные значения, которые вы получите, - это «истина». и «ложь».

105

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


}

или просто проверьте наличие того, чего вы не хотите.

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

}

Предпочитают последний способ, если вы уверены, что в массиве только 2 возможных значения, поскольку он намного более эффективен. Но если вы сомневаетесь, медленная программа лучше неправильной, поэтому используйте первый метод.

Если вы не можете использовать второй метод, ваш массив очень большой, а содержимое массиваlikely иметь более 1 значения (особенно, если это значение может произойти в начале массива), это может бытьmuch быстрее сделать следующее:

function isHomogenous($arr) {
    $someValue = current($arr);
    foreach ($arr as $val) {
        if ($someValue !== $val) {
            return false;
        }
    }
    return true;
}

* примечание - некоторые ответы интерпретируют исходный вопрос как 1)how to check if all values are the sameв то время как другие интерпретировали это как 2)how to check if all values are the same AND make sure that value equals the test value, Решение, которое вы выбираете, должно учитывать эту деталь. Мои первые 2 решения ответили # 2. мойisHomogenous() Функция отвечает на # 1, хотя вы можете изменить его, чтобы ответить на # 2, передав значение$firstValue в качестве тестового значения, вместо использования первого значения, найденного в массиве, как я сделал.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededend($arr)Error: User Rate Limit Exceeded$arr[0]Error: User Rate Limit Exceeded$arr['foo']
Error: User Rate Limit Exceeded
9

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

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

в

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

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

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

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

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

Похожие вопросы