2013-05-27 5 views
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, чтобы вычислить среднее значение.

+0

Этот вывод имеет фактический код, тот, который приведен выше, является аналогичным, но с меньшим количеством данных для целей тестирования! – Mirela

+0

Где: echo "total" в вашем коде? – SaidbakR

+0

@ sємsєм находится во втором состоянии «если». Я только что отредактировал код .. извините, я пропустил это. – Mirela

ответ

1

Я почти уверен, что пример кода, который вы предоставили, не соответствует вашему реальному коду, поэтому я не буду пытаться его исправить, но я попытаюсь объяснить, как вы можете исправить проблему, есть в вашем реальном коде.

Предположительно у вас есть петля какого-то типа, которая выполняет итерацию над значениями в массиве $values. Я также предполагаю, что некоторые из значений в этом массиве меньше или равны нулю, и это те точки, в которых вы показываете среднее значение.

Ваша проблема в том, что ваша петля достигает конца массива, не имея возможности отображать среднее значение для последнего набора значений.

Одним простым решением является добавление нуля в конец массива, если его еще нет. Таким образом, последнее значение, которое встречается в цикле, всегда будет равным нулю, что будет соответствовать условию, необходимому для отображения среднего.

Если это не представляется возможным, вы могли бы сделать ваш цикл не останавливается, когда он достигает конца массива, так что если это цикл в то время, она по существу становится:

while (true) ... 

Тогда вы измените свое первое условие к этому:

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

поэтому он соответствует только если вы не прошли мимо конца массива. В противном случае он будет отображаться в среднем.

И в конце среднего кода вы добавляете еще одну проверку, чтобы проверить, не прошли ли вы конец массива и вырвались из цикла.

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

Эти изменения сами по себе не исправит пример кода вы предоставили, но это может помочь, если ваш реальный код соответствует функциональности вы описали в этом вопросе.

Смежные вопросы