Вы можете вставить нули, чтобы восполнить пустые места, потому что каждый раз, который не представлен в данных, соответствует секунде, где были выполнены нулевые действия. Это, вероятно, концептуально простой способ. Вам не нужно на самом деле вставлять нули в; то, что вы могли бы сделать, это создать функцию, которая возвращает $p1[$t]
, если она существует, в противном случае 0. Затем просто используйте вашу функцию вместо прямого доступа к $p1
. (Мой PHP довольно ржавый, поэтому при необходимости рассмотрите этот PHP-подобный псевдокод)
function actions_at_second($t) {
return ($t in $p1) ? $p1[$t] : 0;
}
Имейте в виду, что даже если у вас нет необработанных данных в течение определенных секунд, общее число действий за эти секунды все равно будет отличным от нуля. Поэтому вам следует создавать точку данных в конечном массиве APM каждую секунду, независимо от того, были ли выполнены какие-либо действия или нет.
Что касается фактического вычисления скользящего среднего, то вы можете выполнить итерацию в течение первых 60 секунд и сохранить накопленную сумму в выходном массиве:
for ($t = 1; $t <= 60; $t++) {
$total += actions_at_second($t);
$data['player_1'][$t] = $total * 60 / $t;
}
(Это нужно будет скорректировать, если ваши необработанные данные содержат запись для нулевых секунд). Затем, после первых 60 секунд, каждый раз, когда вы добавляете количество действий в данную секунду, вычитаете количество действий, выполненных на 60 секунд раньше:
for ($t = 61; $t <= $tmax; $t++) {
$total += actions_at_second($t) - actions_at_second($t - 60);
$data['player_1'][$t] = $total;
}
($tmax
будет самой высокой секундой, в которую у вас есть данные, в основном, продолжительность игры.) Я полагаю, что в последнем примере $total
больше не представляет полную совокупную сумму, поэтому вы можете переименовать ее - но она должна быть той же переменной, что и $total
в предыдущем примере кода.
Кстати, я предполагаю, что $tmax
никогда не будет меньше 61. Если вы собираетесь выпускать этот код «в дикую природу» для использования другими людьми, убедитесь, что вы проверили этот случай ( на случай досрочной сдачи или чего-то еще).