过滤两个 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 循环转换为数组函数。
我最近的编辑使用新建议的键添加了更多样本乐谱数据。对 $fscore
的 tarray
比较的调整是现在将最低的非 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,
),
)
我有两个数组。我将两个数组组合在一起输出总计
第一个数组 =
$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 循环转换为数组函数。
我最近的编辑使用新建议的键添加了更多样本乐谱数据。对 $fscore
的 tarray
比较的调整是现在将最低的非 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,
),
)