Ответ 1
if(count(array_unique($your_array)) === 1)
return current($your_array);
else return;
Как проверить, являются ли все 20 переменных истинными, или если все 20 переменных являются ложными?
если возможно, без использования очень длинного, если...
переменные являются фактически элементами массива:
array ('a' = > true, 'b' = > true...)
чтобы сделать его более понятным:
if(count(array_unique($your_array)) === 1)
return current($your_array);
else return;
Вы можете использовать in_array
Ex. для всех true:
if(in_array(false, $array, true) === false){
return true;
}
else if(in_array(true, $array, true) === false){
return false;
}
else{
return 'nothing';
}
Можно использовать array_product
, как показано на php.net в комментарии:
$check[] = boolval(TRUE);
$check[] = boolval(1);
$check[] = boolval(FALSE);
$check[] = boolval(0);
$result = (bool) array_product($check);
// $result is set to FALSE because only two of the four values evaluated to TRUE
Простой цикл. Имейте в виду, что если массив пуст, выполняются оба условия (все ложные и все истинные). Вы не увидите этого в результате, из-за else, но вы можете узнать, как вы хотите справиться с этим.
// Input
$x = array ('a'=>false, 'b'=>false, 'c'=>false);
// Initialization
$anytrue = false;
$alltrue = true;
// Processing
foreach($x as $k=>$v)
{
$anytrue |= $v;
$alltrue &= $v;
}
// Display result
if ($alltrue)
echo 'All elements are true';
elseif (!$anytrue)
echo 'All elements are false';
else
echo 'Mixed values';
Если вы сохраняете только логические значения, используйте это:
$a = array('a'=> true, 'b'=> true, 'c'=>true);
$af = array_filter($a);
if ($af == $a) {
echo "all true";
}
if (empty($af)) {
echo "all false";
}
Примечание. Если у вас есть другие значения в массиве, они будут преобразованы в boolean в соответствии с ужасающими правилами преобразования PHP.
Если все элементы массива имеют значения true/false, используйте array_flip():
$new = array_flip($array);
if (!isset($array[false]) && isset($array[true])) {
... there no false values, and at least one true value
}
Забастовкa >
Это может стать дорогостоящим для большого массива, поэтому вместо этого вы можете попробовать array_unique()
. Вы получите массив с не более чем двумя значениями (один true, один false).
Хорошо, так что это не сработает. Простой подход дробовика:
if (in_array($yourarray, false, TRUE)) {
... at least one non-true value
}
Используйте цикл for. Если вы хотите проверить, что все переменные являются ложными, вы можете использовать цикл for: как только вы найдете истинный элемент, вы можете сломать цикл, иначе переменные будут ложными. Тот же метод, который вы можете использовать, если вы хотите проверить, что все переменные являются истинными.
Этот вопрос древний, но неважно. Я хотел сравнить различные подходы. Метод in_array()
работает лучше всего, так как он, вероятно, не требует итерации по всему массиву. (Коэффициенты низки, у вас будет только одно уникальное булево значение в конце, но даже тогда оно хорошо работает.)
Один из способов, не упомянутых здесь, - array_sum($array)
, который возвращает 0
, если все значения false
и 1+
, если где-то есть значение true
. Подобно подходу array_filter
, он не скажет вам, присутствуют ли оба, но полезно узнать, что-либо есть true
. Я также добавил базовую проверку foreach
для смешанного или все true/false и in_array
, которая просто проверяет, что что-то есть true
(как *_bin
ниже).
Итак, вот тесты. Каждый случай повторяется 100000 раз с массивом из 10, 100 или 1000 случайных логических элементов; и снова с 9, 99 и 999 идентичными булевыми, с последним уникальным (для полного итерационного времени для in_array
). Первые три проверенных теста выдают запрошенный результат true/false/both
, а остальные четыре просто проверяют наличие значения true
.
Затем, вкратце. Путь array_unique
явно держит хвост, не используется для больших массивов или больших массивов! Путь foreach
имеет небольшое ребро над in_array
, но, увы, код не такой элегантный. Способ array_sum
находится на одном уровне с проверкой "if true" для меньших (< 100) массивов. (Я копаю простоту в array_sum($array) > 0
.) array_filter
путь немного отстает от in_array
и foreach
. Когда только последнее значение отличается, foreach
и array_unique
оба сильно перетаскивают его.
Наконец, функция foreach
для хороших юморов. Очень читаемо. Правда там!
function foreach_truth_test($array)
{
$trues = $falses = false;
foreach($array as $val) {
if ($val === true) {
$trues = true;
} elseif ($val === false) {
$falses = true;
}
if ($trues === true && $falses === true) {
return 'both'; // Enough information.
}
}
// Regular Universe
if ($trues === true && $falses === false) {
return 'true';
} // Evil Mirror Universe
elseif ($trues === false && $falses === true) {
return 'false';
} // Intergalactic Void
else {
return 'void'; // =^_^=
}
}
P.S. Может использовать "null" выше, но он читает больше удовольствия так. Сравнительно с Windows, так что показания микросессии коротки.
Более того, вы можете иметь список o переменных (а не только массив значений) для проверки всех значений с определенным значением.
$var1 = true;
$var2 = true;
$var3 = false;
$isAllVarsTrue = !in_array(false, [$var1, $var2, $var3], true);
var_dump($isAllVarsTrue); //false
// set default value
$result = false;
foreach ($array as $key => $value) {
if ($value === true) {
$result = true;
break;
}
}
// $result is now true if any value was true, otherwise it false