Фильтрация двух массивов php

У меня есть два массива. Я объединил оба массива для вывода общего

1-й массив =

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

2nd Array =

$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. Если ключом оценки является ED в $ tarray, минимальная оценка больше или равна 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
)
)

0

Решение

Я не думаю, что я буду пытаться оживить этот ответ с array_reduce() вызов. Гораздо важнее представить правильные сравнения и результат. Вы, конечно, можете преобразовать мою серию циклов foreach в функции массива.

В моём последнем редактировании добавлены дополнительные данные для оценки с помощью новых советов. Корректировка на $fscore«s tarray Сравнение в том, что сейчас самый низкийED оценка сравнивается с 26,

Код: (демонстрация)

$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,
),
)
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector