Проверьте, все ли значения false или все верно

Как проверить, являются ли все 20 переменных истинными, или если все 20 переменных являются ложными?

если возможно, без использования очень длинного, если...

переменные являются фактически элементами массива:

array ('a' = > true, 'b' = > true...)

чтобы сделать его более понятным:

  • если массив имеет как true, так и false значения возвращают ничего
  • Если массив имеет только истинные значения, верните true
  • если массив имеет только ложные значения, возвращает false :)

Ответы

Ответ 1

if(count(array_unique($your_array)) === 1)  
  return current($your_array);

else return;

Ответ 2

Вы можете использовать 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';
}

Ответ 3

Можно использовать 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

Ответ 4

Простой цикл. Имейте в виду, что если массив пуст, выполняются оба условия (все ложные и все истинные). Вы не увидите этого в результате, из-за 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';

Ответ 5

Если вы сохраняете только логические значения, используйте это:

$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.

Ответ 6

Если все элементы массива имеют значения 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
}

Ответ 7

Используйте цикл for. Если вы хотите проверить, что все переменные являются ложными, вы можете использовать цикл for: как только вы найдете истинный элемент, вы можете сломать цикл, иначе переменные будут ложными. Тот же метод, который вы можете использовать, если вы хотите проверить, что все переменные являются истинными.

Ответ 8

Этот вопрос древний, но неважно. Я хотел сравнить различные подходы. Метод 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.


СЛУЧАЙНЫЕ БОЛОНЫ

  • in_array: 10 bools = 0,16 с
  • foreach: 10 bools = 0.122 sec
  • array_unique: 10 bools = 0.274 sec
  • foreach_bin: 10 bools = 0.095 sec
  • in_array_bin: 10 bools = 0.073 sec
  • array_sum: 10 bools = 0.074 sec
  • array_filter: 10 bools = 0.118 секунд

  • in_array: 100 bools = 0.153 sec
  • foreach: 100 bools = 0.122 sec
  • array_unique: 100 bools = 2.3451 sec
  • foreach_bin: 100 bools = 0.094 sec
  • in_array_bin: 100 bools = 0.074 sec
  • array_sum: 100 bools = 0.126 sec
  • array_filter: 100 bools = 0.228 sec

  • in_array: 1000 bools = 0.154 sec
  • foreach: 1000 bools = 0.149 sec
  • array_unique: 1000 bools = 32.6659 сек (!!)
  • foreach_bin: 1000 bools = 0.075 sec
  • in_array_bin: 1000 bools = 0.074 sec
  • array_sum: 1000 bools = 0.8771 sec
  • array_filter: 1000 bools = 1.4021 sec

LAST BOOLEAN DIFFERS

  • in_array: 10 bools = 0.152 sec
  • foreach: 10 bools = 0.342 sec
  • array_unique: 10 bools = 0.269 sec
  • foreach_bin: 10 bools = 0.074 sec
  • in_array_bin: 10 bools = 0.076 секунд
  • array_sum: 10 bools = 0.074 sec
  • array_filter: 10 bools = 0.121 sec

  • in_array: 100 bools = 0.159 sec
  • foreach: 100 bools = 2.8072 sec
  • array_unique: 100 bools = 2.7702 sec
  • foreach_bin: 100 bools = 0.074 sec
  • in_array_bin: 100 bools = 0.09 sec
  • array_sum: 100 bools = 0.118 sec
  • array_filter: 100 bools = 0.248 sec

  • in_array: 1000 bools = 0.312 sec
  • foreach: 1000 bools = 27.5256 секунд
  • array_unique: 1000 bools = 42.1594 sec
  • foreach_bin: 1000 bools = 0.074 sec
  • in_array_bin: 1000 bools = 0,24 с
  • array_sum: 1000 bools = 0.555 sec
  • array_filter: 1000 bools = 1.3601 sec

Затем, вкратце. Путь 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, так что показания микросессии коротки.

Ответ 9

Более того, вы можете иметь список o переменных (а не только массив значений) для проверки всех значений с определенным значением.

$var1 = true;
$var2 = true;
$var3 = false;

$isAllVarsTrue = !in_array(false, [$var1, $var2, $var3], true);

var_dump($isAllVarsTrue); //false

Ответ 10

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