过滤两个 php 数组

Filtering two php arrays

我有两个数组。我将两个数组组合在一起输出总计

第一个数组 =

$farray = Array ( 
    [0] => Array ( 
        [1] => Array ( 
                [ED] => 15 
                [EN] => 14
                )
         )
    [1] => Array ( 
        [2] => Array ( 
                [ED] => 5 
                [EN] => 10 
               )
          )
     )

第二个数组 =

$tarray = Array ( 
    [0] => Array ( 
        [1] => Array ( 
                [ED] => 45 
                [EN] => 50                  
            ) 
        ) 
    [1] => Array ( 
        [2] => Array ( 
                [ED] => 38 
                [EN] => 40
               )
         )
    )

以上两个数组的组合:

  $all = Array ( 
       [0] => Array ( 
            [1] => Array ( 
                [ED] => 60
                [EN] => 64                  
               ) 
            ) 
       [1] => Array ( 
            [2] => Array ( 
                 [ED] => 43 
                 [EN] => 50
                  ) 
             )
        )

现在我想使用第一个数组和第二个数组将条件插入到以下代码中:

$fscore = array_reduce(
$farray, 
function($farray, $item) {
    $id = key($item);
    $scores = $item[$id];
    $farray[$id] = array(
    "score" => array_sum($scores),
    "farray"=> min($scores)>=7      
   );
    return $farray;
   },
   array()
 );

以上尝试有效并输出以下内容 (print_r($fscore)):

 Array ( 
        [1] => Array ( 
            [score] => 124
            [farray] => 1 
            ) 
        [2] => Array ( 
            [score] => 93
            [farray] => 0
            ) 
      )

但我想给它加上更多条件,并与 $tarray 结合,如下所示:

 $all= array_reduce(
 $all, 
  function($all, $item) {
    $id = key($item);
    $scores = $item[$id];
    $all[$id] = array(
    "score" => array_sum($scores),
    "farray"=> min($scores)>=7
    //if tarray key==ED 23 else 26 for minimum `$scores`
    "tarray"=> min($scores)>='ED'? 23:26//ternary operator
   );
    return $all;
   },
   array()
 );

我不知道如何插入 $tarray。如前所述,没有 $tarray,它可以工作。

我的尝试失败了,没有输出预期的结果。这道题我只用了ED和EN(score keys)来存多space。 $farray 的预期最小分数大于或等于 7,而 $tarray 的预期最小分数为 23/26。如果分数键是 $tarray 中的 ED,则最低分数大于或等于 23,否则必须为 26。根据这些条件,我想要 return true 或 false 值。请帮忙。以下是我的尝试:

    $farray = array(
            array (
                1=> array(
                    "ED"=>15,
                    "EN"=>14
                   )
               ),
            array(
               2=>array(
                    "ED"=>5,
                    "EN"=>10
                   )
                 )
               );

$tarray = array ( 
         array ( 
           1 => array ( 
                "ED" => 45, 
                "EN" => 50                  
            ) 
        ), 
         array ( 
          2 => array ( 
                "ED" => 38, 
                "EN" => 40
               )
         )
    );

$combine = array ( 
       array ( 
            1 => array ( 
                "ED" => 60,
                "EN" => 64                  
               ) 
            ), 
      array ( 
            2 => array ( 
                 "ED" => 43 ,
                 "EN" => 50
                  ) 
             )
        );

function filtertArray($value){
    foreach($value as $key =>$val){
    foreach($val as $k=>$v){
        foreach($v as $t=>$m){
            if($t=='ED'){
               return $m>=23;
            }else{
               return $m>=26;
            }            
        }
    }
  }
}
function filterfArray($value){
    foreach($value as $key =>$val){
    foreach($val as $k=>$v){
        foreach($v as $t=>$m){            
           return $m>=7;                   
        }
    }
  }
}

 $all = array_reduce(
     $combine, 
     function($combine, $item) use ($farray, $tarray) {
        $id = key($item);
        $scores = $item[$id];
        $combine[$id] = array(
              "score" => array_sum($scores),
              "farray"=> array_filter($farray,"filterfArray"),
              "tarray"=> array_filter($tarray,"filtertArray")
            );
         return $combine;
     },
     array()
   );
echo "<pre>";
print_r($all);
echo "</pre>";

这输出:

E_WARNING : type 2 -- Invalid argument supplied for foreach()

这段代码的预期输出是:

Array ( 
    [1] => Array ( 
        [score] => 124
        [farray] => true//1
        [tarray] => true//1
        ) 
    [2] => Array ( 
        [score] => 93
        [farray] => false//0
        [tarray] => true//1
        ) 
  )

我认为我不会费心尝试通过 array_reduce() 电话来为这个答案增添趣味。更重要的是全面地提供正确的比较和结果。当然欢迎您将我的一系列 foreach 循环转换为数组函数。

我最近的编辑使用新建议的键添加了更多样本乐谱数据。对 $fscoretarray 比较的调整是现在将最低的非 ED 分数与 26.

进行比较

代码:(Demo)

$farray=[[1=>['ED'=>15,'EN'=>14,'MT'=>16,'MZ'=>20]],[2=>['ED'=>5,'EN'=>10,'MT'=>36,'MZ'=>30]]];
$tarray=[[1=>['ED'=>45,'EN'=>50,'MT'=>28,'MZ'=>27]],[2=>['ED'=>38,'EN'=>40,'MT'=>56,'MZ'=>60]]];

// generate $all
foreach($farray as $i=>$a){
    foreach($a as $n=>$scores){
        foreach($scores as $k=>$v){
            $all[$i][$n][$k]=$v+$tarray[$i][$n][$k];  // sum the relative scores
        }
    }
}
var_export($all);
echo "\n\n";

// generate $fscores
$sub23_keys=array_flip(['ED']);  // store list of keys that have lower score minimum
foreach($all as $i=>$a){
    foreach($a as $n=>$scores){
        $fscores[$n]['score']=array_sum($scores);
        $fscores[$n]['farray']=min($farray[$i][$n])>=7;  // check that both ED and EN scores are >=7
        $fscores[$n]['tarray']=min(array_intersect_key($tarray[$i][$n],$sub23_keys)) && min(array_diff_key($tarray[$i][$n],$sub23_keys))>=26;
    }
}
var_export($fscores);

输出:

// $all=
array (
  0 => 
  array (
    1 => 
    array (
      'ED' => 60,
      'EN' => 64,
      'MT' => 44,
      'MZ' => 47,
    ),
  ),
  1 => 
  array (
    2 => 
    array (
      'ED' => 43,
      'EN' => 50,
      'MT' => 92,
      'MZ' => 90,
    ),
  ),
)

//$fscores=
array (
  1 => 
  array (
    'score' => 215,
    'farray' => true,
    'tarray' => true,
  ),
  2 => 
  array (
    'score' => 275,
    'farray' => false,
    'tarray' => true,
  ),
)