基于关联数据计算总记录的最佳方法


Best way to calculate overall records based on associative data

我正在处理比赛的最终结果及其关于最佳培训师的一般报告以及培训师应该得到的位置。

我已经在下面准备了关联数组。key代表教练的ID,value代表他/她的运动员获得的类别(金牌,银牌,铜牌)的奖牌

[gold] => Array
   (
       [777777] => 4
       [333333] => 2
       [555555] => 1
       [999999] => 1
   )
[silver] => Array
   (
       [999999] => 3
       [777777] => 3
       [333333] => 2
   )
[bronze] => Array
   (
       [333333] => 6
       [777777] => 4
       [999999] => 2
   )

下一个数组将训练师的 ID 与其名称相关联:

[trainers] => Array
   (
       [333333] => Trainer 4
       [777777] => Trainer 1
       [999999] => Trainer 2
       [555555] => Trainer 3
   )

我已经坚持将上面的数据处理成这样的最终结果。关于如何优雅地完成的任何想法?问题是数据从来都不是恒定的,数组的大小总是不同的。

任何帮助将不胜感激。

下面是代码示例:

$gold、$silver、$bronze$trainers是包含您提供的信息的数组。

$out = [];
foreach($trainers as $trainerId=> $trainerName){
  $out[] = array(
    'id'=>$trainerId,
    'name'=>$trainerName,
    'gold'=>isset($gold[$trainerId])?$gold[$trainerId]:0,
    'silver'=>isset($silver[$trainerId])?$silver[$trainerId]:0,
    'bronze'=>isset($bronze[$trainerId])?$bronze[$trainerId]:0,
  );
}
uasort($out, function($a, $b){
  // Here: sort by your algorithm. Here is example:
  if($a['gold'] != $b['gold']){
    return $b['gold'] - $a['gold'];
  }
  if($a['silver'] != $b['silver']){
    return $b['silver'] - $a['silver'];
  }
  return $b['bronze'] - $a['bronze'];
});
$placeId = 1;
foreach($out as &$info){
    $info['place'] = $placeId++;
}
unset($info);
foreach($out as $info){
  echo "{$info['place']} place goes to - {$info['name']} ({$info['id']}) as he/she got {$info['gold']} gold medals, {$info['silver']} silver and {$info['bronze']} bronze";
}        

以下是使用指标的另一种方法:

$gold = array
   (
       '777777' => 4,
       '333333' => 2,
       '555555' => 1,
       '999999' => 1
   );
$silver = array
   (
       '999999' => 3,
       '777777' => 3,
       '333333' => 2
   );
$bronze = array
   (
       '333333' => 6,
       '777777' => 4,
       '999999' => 2
   );
$trainers = array
   (
       '333333' => 'Trainer 4',
       '777777' => 'Trainer 1',
       '999999' => 'Trainer 2',
       '555555' => 'Trainer 3'
   );

$metrics = [
  'gold' => 3,
  'silver'=> 2,
  'bronze' => 1];
$results = [];
foreach ($metrics as $arrName => $metric)
{
  foreach (${$arrName} as $trainerId => $medals)
  {
    $results[$trainerId] = ( isset($results[$trainerId]) ) ? $results[$trainerId]+$medals * $metric : $medals * $metric;
  }
}
// sorting scores (by value)
arsort($results);
// print scores
var_dump($results);
// print final results
$placeOut = '';
foreach ($results as $trainerId => $score) {
  $placeOut .= $trainers[$trainerId].": he/she has ";
  foreach ($metrics as $medalName => $metric) {
    $placeOut .= (${$medalName}[$trainerId] > 0 ? ${$medalName}[$trainerId] : 0)." ".$medalName.", ";
  }
  $placeOut .= "'n";
}
echo "<pre>".$placeOut."</pre>";
 ?>