2016-07-08 2 views
-2

Каков наилучший способ преобразования значений массива в оператор if. Значения массива следует сравнивать с помощью AND и массивов с помощью OR. Я могу сделать это с помощью EVAL, но ищет что-то другое, кроме EVAL.Преобразование булевых значений внутри массива в оператор if

$arr = Array(
    [0] => Array 
     (
      [0] => false 
      [1] => true 
     ) 
    [1] => Array 
     (
      [0] => true 
      [1] => false 
     ) 
    [2] => Array 
     (
      [0] => false 
     ) 
    [3] => Array 
     (
      [0] => true 
     ) 
    [4] => Array 
     (
      [0] => true, 
      [1] => true, 
      [2] => true 
     ) 
) 

Я хочу построить сравнение динамично, если заявление ..

Например

if(($arr[0][0] && $arr[0][1]) || ($arr[1][0] && $arr[1][1]) .... and so on)

+0

Непонятно, что вы просите. Что бы вы ожидали от этого набора массивов? – cyberbit

+0

@cyberbit извините за неполный вопрос, обновил мой пост. –

+2

Вы можете использовать 'array_reduce()', но простой цикл, вероятно, будет более эффективным. – Rizier123

ответ

3
$result = array_reduce($arr, function ($result, array $values) { 
    return $result || array_reduce($values, function ($result, $value) { 
     return $result && $value; 
    }, true); 
}, false); 

if ($result) ... 

Один array_reduce может элегантно сделать это для одного массива, вы просто хотите сделайте это для двух уровней вложенных массивов.

+0

Кто-то однажды сказал: «« Это действительно намного лучше, чем простой цикл foreach, кроме «но, но функциональное программирование ...!», Дискуссионно ». *: P С помощью простого цикла вы можете легко сломать и остановите цикл, как только один subArray приведет к TRUE. – Rizier123

+2

Человек, это действительно солидный совет; Должно быть, это были мудрые, мудрые, наушники, одетые в человека. – deceze

+1

Спасибо, у вас есть дополнительные} после ложного. Большое спасибо. –

2

Что вы делаете, это генерация одного булева значения из массива. Это называется сокращением операции. В php мы можем сделать это с помощью array_reduce(..).

array_reduce($input, 
    function($prev, $item) { 
    //Short-circuit if we already deduced it to be true 
    if($prev) { 
     return $prev; 
    } 

    //If one value is false, the entire thing is false 
    foreach($item as $k => $v) { 
     if(!$v) { 
     return false; 
     } 
    } 

    //All were true 
    return true; 
    }, false); 
+0

Спасибо. Никогда ранее не применялся массив, узнал что-то новое. –

Смежные вопросы