Проверьте, являются ли все значения ложными - PullRequest
19 голосов
/ 27 июля 2011

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

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

переменные на самом деле являются массивомэлементы:

массив ('a' => true, 'b' => true ...)

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

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

Ответы [ 10 ]

48 голосов
/ 28 июля 2011
if(count(array_unique($your_array)) === 1)  
  return current($your_array);

else return;
19 голосов
/ 28 июля 2011

Вы можете использовать in_array

Ex. для всего истинного:

if(in_array(false, $array, true) === false){
    return true;
}
else if(in_array(true, $array, true) === false){
    return false;
}
else{
     return 'nothing';
}
10 голосов
/ 03 августа 2013

Можно использовать 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 голосов
/ 28 июля 2011

Простой цикл будет делать.Помните, что если массив пуст, оба условия выполняются (все ложь и все истина).Вы не увидите этого в результате из-за всего остального, но вы сами можете узнать, как вы хотите справиться с этим.

// 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';
3 голосов
/ 21 ноября 2016

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


СЛУЧАЙНЫЕ BOOLEANS

  • in_array : 10 bools = 0,16 с
  • foreach : 10 bools = 0,122 сек
  • array_unique : 10 bools = 0,274 сек
  • foreach_bin : 10 бул = 0,095 с
  • in_array_bin : 10 bools = 0,073 с
  • array_sum : 10 bools = 0,074 сек
  • array_filter : 10 bools = 0,118 с

  • in_array : 100 бул = 0,153 с
  • foreach : 100 бул = 0,122 с
  • array_unique : 100 бул = 2,3451 с
  • foreach_bin : 100 бул = 0,094 с
  • in_array_bin : 100 бул = 0,074 сек
  • array_sum : 100 bools = 0,126 сек
  • массив_фильтров : 100 бул = 0,228 с

  • in_array : 1000 бул = 0,154 с
  • foreach : 1000 бул = 0,149 сек
  • array_unique : 1000 bools = 32,6659 сек (!!)
  • foreach_bin : 1000 бул = 0,075 с
  • in_array_bin : 1000 bools = 0,074 сек
  • массив_сум : 1000 бул = 0,8771 сек
  • array_filter : 1000 bools = 1,4021 с

ПОСЛЕДНИЕ БУЛЕВЫЕ ОТЛИЧИЯ

  • in_array : 10 bools = 0,152 с
  • foreach : 10 бул = 0,342 с
  • array_unique : 10 bools = 0,269 сек
  • foreach_bin : 10 бул = 0,074 сек
  • in_array_bin : 10 bools = 0,076 с
  • array_sum : 10 bools = 0,074 сек
  • array_filter : 10 bools = 0,121 сек

  • in_array : 100 бул = 0,159 с
  • foreach : 100 бул = 2,8072 с
  • array_unique : 100 бул = 2,7702 с
  • foreach_bin : 100 бул = 0,074 сек
  • in_array_bin : 100 бул = 0,09 с
  • массив_сум : 100 бул = 0,118 с
  • array_filter : 100 bools = 0,248 сек

  • in_array : 1000 бул = 0,312 с
  • foreach : 1000 бул = 27,5256 с
  • array_unique : 1000 bools = 42,1594 с
  • foreach_bin : 1000 бул = 0,074 сек
  • in_array_bin : 1000 бул = 0,24 с
  • массив_сумма : 1000 бул = 0,555 сек
  • массив_фильтров : 1000 бул = 1,3601 с

Затем, в итоге. Способ array_unique четко удерживает хвост, не используйте для больших массивов или больших объемов массивов! Способ foreach имеет небольшое преимущество перед in_array, но, увы, код не такой элегантный. Способ array_sum находится на одном уровне с проверками if if для меньших (<100) массивов. (Я копаю простоту в <code>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, так что показания микротайма короткие.

3 голосов
/ 28 июля 2011

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

$a = array('a'=> true, 'b'=> true, 'c'=>true);
$af = array_filter($a);
if ($af == $a) {
    echo "all true";
}
if (empty($af)) {
    echo "all false";
}

Примечание: если в массиве есть другие значения, они будут преобразованы в логические значения в соответствии с ужасающими правилами преобразования PHP.

2 голосов
/ 31 августа 2017

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

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

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

var_dump($isAllVarsTrue); //false
2 голосов
/ 28 июля 2011

Если все они являются элементами массива со значениями true / false, используйте array_flip ():

$new = array_flip($array); if (!isset($array[false]) && isset($array[true])) { ... there's no false values, and at least one true value }

Это может дорого обойтись для большого массива, поэтому вы можете попробовать array_unique(). Вы получите массив, содержащий не более двух значений (одно истинное, одно ложное).


Хорошо, так что это не сработает. Простой подход к дробовику:

if (in_array($yourarray, false, TRUE)) {
   ... at least one non-true value
}
1 голос
/ 28 июля 2011

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

0 голосов
/ 28 июля 2011
// 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's false
...