2

我有两个匹配数据数组。一个与价值观有关,另一个与时间有关。我将时间四舍五入到最接近的 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可以计算平均值。

4

1 回答 1

1

我几乎可以肯定您提供的示例代码与您的真实代码不匹配,所以我不会尝试修复它,但我会尝试解释您如何解决您声称在真实代码中存在的问题代码。

假设你有一个循环遍历$values数组中的值。我还假设该数组中的某些值小于或等于零,并且这些值是您显示平均值的点。

那么你的问题是你的循环到达数组的末尾而没有机会显示最后一组值的平均值。

一种简单的解决方案是,如果数组末尾还没有零,则在数组末尾添加一个零。这样循环遇到的最后一个值将始终为零,这将匹配显示平均值所需的条件。

如果这不可行,你可以让你的循环在到达数组末尾时不停止,所以如果它是一个 while 循环,它基本上变成:

while (true) ...

然后您将第一个条件更改为:

if ($i < count($values) && $values[$i] > 0) {

所以它只有在你没有超过数组末尾时才匹配。否则,它会显示平均值。

在平均代码的末尾,您添加另一个检查以查看您是否超过了数组的末尾并跳出循环。

if ($i >= count($values)) break;

仅这些更改不会修复您提供的示例代码,但如果您的真实代码与您在问题中描述的功能相匹配,它可能会有所帮助。

于 2013-05-27T20:27:14.420 回答