在我的CakePHP应用程序中,我正在提取一个名为“Timesheets”的表的结果。这张桌子有一个Athle_id和一些比赛的分段次数。与其他运动员相比,我需要对一名运动员进行一些计算(例如,计算最快完成时间和最慢运动时间之间的差异)。
我认为最好的方法是将每个运动员的“完成”存储在一个新阵列中,然后在其上运行min()函数。对于我的生活,我无法让这个工作......
你认为我接近这个错误的方式,还是我只是错过了什么?
foreach ($timesheet['Run'] as $run):
<tr<?php echo $class;?>>
<td><?php echo $run['athlete_id'];?></td>
<td><?php echo $run['start'];?></td>
<td><?php echo $run['split1'];?></td>
<td><?php echo $run['split2'];?></td>
<td><?php echo $run['split3'];?></td>
<td><?php echo $run['split4'];?></td>
<td><?php echo $run['split5'];?></td>
<td><?php echo $run['split6'];?></td>
<td><?php echo $run['finish'];?></td>
</tr>
endforeach
答案 0 :(得分:1)
假设您从数据库中使用 order by finish asc 获取时间表,您可以执行以下操作(省略拆分以简化):
$fastest = $previous = $timesheet['Run'][0]['finish'];
foreach ($timesheet['Run'] as $run):
<tr>
<td><?php echo $run['athlete_id'];?></td>
<td><?php echo $run['finish'];?></td>
<td><?php echo $previous - $run['finish'];?></td>
<td><?php echo $fastest - $run['finish'];?></td>
</tr>
$previous = $run['finish'];
endforeach
这应该给出这样的行:
id | finished_in | to_previous | to_best
1 | 120 | 0 | 0
2 | 121.5 | -1.5 | -1.5
3 | 121.8 | -0.3 | -1.8
4 | 122.6 | -0.8 | -2.6
...
另一种选择是将返回的数组包装到Object或ArrayIterator中,然后在里面执行calulcations,封装$ faster和$ previous以及你可能想要计算的任何其他内容。
答案 1 :(得分:0)
我假设你在foreach周围有一个合适的标签和';'在endforeach之后。
所以问题变成你可以访问$ timesheet ['Run'] [0] ['athlete_id']吗?您可以使用print_r()来确保$ timesheet符合您认为的格式。
答案 2 :(得分:0)
我会考虑使用像usort这样的东西。您可以定义一个回调函数,通过'finish'键对$ timesheet ['Run']数组进行排序。最后,如果正确定义,数组中的第一个条目将具有最短的完成时间。
例如:
function cmp($a, $b)
{
if ($a['finish'] == $b['finish'])
{
return 0;
}
return ($a['finish'] < $b['finish']) ? -1 : 1;
}
usort($timesheet['Run'], "cmp");
答案 3 :(得分:0)
我建议在控制器和SQL中进行计算和排序。
答案 4 :(得分:0)
在我看来,您需要更改存储数据的方式。 尝试创建包含id,event_id,athlete_id和time的表,这将使您的应用程序更灵活,计算更容易。