我有两个匹配数据数组。一个是值,另一个是时间。我把时间缩短到最近的5分钟,结果我有一个新的数组,有几个小时重复自己。我将相等的小时数分组,计算它们,在另一个数组中对它们各自的值进行求和,然后计算该小时的平均值。这是代码:
$first_hour = array('11:01', '12:04', '13:00', '15:28', "15:43", "15:53", "15:55", "16:02", "16:05", "16:17", "16:15", "16:21", "16:25", "16:33", "16:35", "16:43", "16:45", "16:56", "16:58", "17:00", "17:04", "17:07", "17:19");
$values = array(12, 23, 5, 90, 12, 23, 45, 56, 12, 15, 43, 48, 54, 62, 52, 41, 74, 54, 84, 75, 96, 69, 36);
$minutes = 5;
$precision = 60 * $minutes;
$time = "00:00";
$average = 0;
//round first array to nearest 5 minutes
$timestamp = strtotime($first_hour);
$data_ora = date("H,i", round($timestamp / $precision) * $precision);
//the hours array will become like this:
$first_hour = array('11:00', '12:05', '13:00', '15:30', "15:45", "15:50", "15:55", "16:00", "16:05", "16:15", "16:15", "16:20", "16:25", "16:35", "16:35", "16:45", "16:45", "17:00", "17:00", "17:00", "17:05", "17:10", "17:20");
if ($first_hour == $time) {
if ($values[$i] > 0) {
$indexi = $indexi + 1;
$total = $total + $values;
echo "</br> total = ".$total;
$i++;
} else {
$time = date("H,i", round($timestamp / $precision) * $precision);
//echo "time has changed";
$average = $total / $index;
$dataora = date("Y,m,d", round($timestamp)) . "," . $time;
//fill in the vectors
$v[1] = $average;
$v[2] = $dataora;
echo "</br> average = " . $v[1];
$indexi = 0;
$totali = 0;
}
}
输出如下:
"total = 2996
total = 3325
total = 3656
total = 3996
average = 333
total = 329
total = 652
total = 976
total = 1304
total = 1630
total = 1961
total = 2297
total = 2629
average = 328.625
total = 332
total = 660
total = 997
total = 1320
total = 1646
total = 1967
除了最后一组值之外,每个组都有一个平均值。我该如何计算其平均值?对于最后一组,它进入第一个条件,但它不会休息(更改小时)落入else
,以便计算平均值。
答案 0 :(得分:1)
我几乎可以肯定您提供的示例代码与您的实际代码不符,所以我不会尝试修复它,但我会尝试解释您如何解决您声称拥有的问题在您的真实代码中。
假设你有一个循环,它迭代$values
数组中的值。我还假设该数组中的某些值小于或等于零,这些是您显示平均值的点。
然后你的问题是你的循环到达数组的末尾而没有机会显示最后一组值的平均值。
一个简单的解决方案是,如果阵列中没有一个,则在数组的末尾添加零。这样,循环遇到的最后一个值将始终为零,这将与显示平均值所需的条件相匹配。
如果这不可行,你可以让你的循环在到达数组的末尾时不停止,所以如果它是一个while循环,它基本上变成:
while (true) ...
然后你将第一个条件改为:
if ($i < count($values) && $values[$i] > 0) {
因此只有在你没有超过数组的末尾时才匹配。否则它会显示平均值。
在平均代码的末尾,你添加另一个检查,以查看你是否已超过数组的末尾并突破循环。
if ($i >= count($values)) break;
仅这些更改不会修复您提供的示例代码,但如果您的真实代码与您在问题中描述的功能相匹配,则可能会有所帮助。