Проверьте, одинаковы ли все значения в массиве
Мне нужно проверить, равны ли все значения в массиве одинаковыми.
Например:
$allValues = array(
'true',
'true',
'true',
);
Если каждое значение в массиве равно 'true'
, тогда я хочу эхо 'all true'
. Если любое значение в массиве равно 'false'
, тогда я хочу эхо 'some false'
Любая идея о том, как я могу это сделать?
Ответы
Ответ 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
}