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

时间:2016-03-21 10:47:09

标签: php arrays

我正在处理最佳培训师的竞赛及其一般报告的最终结果以及培训师应该获得的地方。

我已在下面准备了关联数组。 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
   )

我将上面的数据处理成这样的最终结果。关于如何优雅地完成任何想法?问题是数据永远不变,数组的大小总是不同。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

以下是代码示例:

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

StringBuilder

答案 1 :(得分:1)

以下是使用指标执行此操作的另一种方法:     

$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>";

 ?>