【问题标题】:Filtering two php arrays过滤两个php数组
【发布时间】:2017-08-14 20:12:28
【问题描述】:

我有两个数组。我已将两个数组合并以输出总数

第一个数组 =

$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(分数键)来节省更多空间。 $farray 的预期最小分数大于或等于 7,而 $tarray 的预期最小分数是 23/26。如果分数键是 $tarray 中的 ED,则最小分数大于或等于 23,否则必须为 26。根据这些条件,我想返回 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
        ) 
  )

【问题讨论】:

  • 为什么"tarray"=&gt; min($scores)&gt;='ED'? 23:26 应该生成['tarray']=&gt;1?您的预期输出与您的方法的意图不同。这使您的问题不清楚。
  • @mickmackusa,这将生成真或假值。
  • 不正确,条件会输出2326Demo如果你能澄清你的问题细节,我想帮助你。
  • @mickmackusa,非常感谢。我在问题中添加了更多细节。请看一看。
  • 是的,我正在尝试,但从第一个 $farray 子数组和 $tarray 子数组开始。

标签: php arrays conditional


【解决方案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,
  ),
)

【讨论】:

  • @TechMJ 如果这不太正确,请解释我哪里出错了,以便我编辑我的答案。
  • @mickmackuse,感谢您的回答,这几乎是正确的,但从您对问题的理解来看是完全正确的。我需要添加更多检查,不仅有ED和EN,还有MT,MZ,但ED只是例外,它必须至少为23才能进行比较,我该如何输入?所以这一行:$scores['ED']&gt;=23 &amp;&amp; $scores['EN']&gt;26,我怎样才能改变它,例如如果(ED){ >=23 }否则{ >=26}。感谢您的出色回答。
  • @TechMJ 现在看看。告诉我。
  • 你太棒了。让我更好奇。假设scores['ED'] 和 score['ZA'] 具有相同的最小值(23),考虑到另一个保持不变,我们该怎么做?我会接受你的回答。这很棒。我正在为此工作两天。再次感谢。
  • 我更喜欢低调。谢谢一百万。
猜你喜欢
  • 2016-06-11
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多