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