Как сопоставить и связать уникальные данные?

У меня возникают трудности с выяснением того, как вернуть лучший уникальный матч, при назначении как можно большего количества.

Сценарий: у каждого ребенка есть список любимых фруктов с личным счетом. У нас есть только ОДИН из каждого фрукта, поэтому мы хотим дать его ребенку с самым высоким предпочтением. Можно остаться без плодов, если у кого-то более высокий балл, но мы все равно хотим выдать как можно больше плодов.

Ожидаемый результат будет:

0 = [1] Apple
1 = [0] Mango
2 = [0] Banana
3 = null

Это мой входной массив:

Array
(
[0] => Array
(
[0] => Array
(
[name] => Banana
[score] => 80.2
)
[1] => Array
(
[name] => Apple
[score] => 40
)
)
[1] => Array
(
[0] => Array
(
[name] => Mango
[score] => 70
)
[1] => Array
(
[name] => Banana
[score] => 40
)
)
[2] => Array
(
[0] => Array
(
[name] => Banana
[score] => 90
)
[1] => Array
(
[name] => Orange
[score] => 20
)
)
[3] => Array
(
[0] => Array
(
[name] => Mango
[score] => 60
)
)
)

1

Решение

Мой подход сначала сглаживает ваш ввод в простой 2D массив, позволяющий отсортировать все строки по score сохраняя fruit а также childid данные. После сортировки все строки повторяются (по сравнению с повторным поиском по полному массиву) и сохраняются только наиболее предпочтительные фрукты, если они доступны, для каждого дочернего элемента в соответствии с запросом.

Ввод ОП:

$input=[
[['name'=>'Banana','score'=>80.2],['name'=>'Apple','score'=>40]],
[['name'=>'Mango','score'=>70],['name'=>'Banana','score'=>40]],
[['name'=>'Banana','score'=>90],['name'=>'Orange','score'=>20]],
[['name'=>'Mango','score'=>60]]
];

Метод:

$result=array_fill_keys(array_keys($input),null);  // list all child ids and default to null

// flatten input array for simple sorting and iteration
foreach($input as $i=>$subarrays){
foreach($subarrays as $a){
$restructured[]=['score'=>$a['score'],'fruit'=>$a['name'],'childid'=>$i];
}
}
rsort($restructured);  // will sort the array by score DESC

foreach($restructured as $a){
if(is_null($result[$a['childid']]) && !in_array($a['fruit'],$result)){
// only "fruitless" children wanting what is available
$result[$a['childid']]=$a['fruit'];
}
}

var_export($result);

Выход:

array (
0 => 'Apple',
1 => 'Mango',
2 => 'Banana',
3 => NULL,
)
1

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

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