2016-07-08 5 views
-2

ifステートメントの配列値を変換する最善の方法は何ですか?配列の値は、ANDで比較し、配列をORで比較する必要があります。私はEVALを使ってこれを行うことができますが、EVAL以外のものを探しています。例えば配列内のブール値をifステートメントに変換する

私は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はエレガントに1つの配列のためにこれを行うことができ、あなたは単純にしたいです2つのネストされた配列レベルに対して実行します。

+0

誰かがかつてこう言っていました:* "単純なforeachループよりもはるかに優れているかどうか"、しかし関数型プログラミング...! "、議論の余地があります。 1つの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

ありがとうございます。前にarray reduceを使用したことがなく、新しいことを学んだ。 –

関連する問題