2013-05-27 3 views
2

두 개의 일치하는 데이터 배열이 있습니다. 하나는 값을, 다른 하나는 시간을 말합니다. 나는 가장 가까운 5 분으로 시간을 반올림하고 결과에서 나는 스스로 반복하는 시간을 가진 새로운 배열을 가진다. 나는 평등 한 시간을 그룹화하고, 그것들을 계산하고, 다른 배열에서 각각의 값을 소멸시키고, 그 시간 동안 평균을 취한다. 값의 마지막 그룹을 제외하고 계산 된 평균이있다배열의 마지막 그룹 평균을 구하십시오.

"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 

각 그룹 :

$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; 
    } 
} 

출력이 같다 : 여기서 코드이다. 평균을 어떻게 계산합니까? 마지막 그룹의 경우 첫 번째 조건이되지만 평균이 계산되도록 휴식 시간 (변경 시간)이 else에 속하지 않습니다.

+0

이 출력은 실제 코드와 비슷하지만 위의 테스트 결과는 테스트 용으로 데이터가 적은 비슷한 출력입니다! – Mirela

+0

코드에서 echo "total"은 어디에 있습니까? – SaidbakR

+0

@ sємsєм 두 번째 'if'조건에 있습니다. 방금 코드를 편집했습니다. 죄송합니다. 건너 뛰었습니다. – Mirela

답변

1

제공하신 샘플 코드가 실제 코드와 일치하지 않으므로 해결하지는 않겠지 만, 내가 주장한 문제를 해결할 수있는 방법을 알려 드리겠습니다. 당신의 진짜 코드에있다.

$values 배열의 값을 반복하는 일종의 루프가 있다고 가정합니다. 또한 배열의 값 중 일부는 0보다 작거나 같고 평균은 표시되는 지점이라고 가정합니다.

그런데 문제는 루프가 배열의 끝에 도달하여 마지막 값 집합의 평균을 표시 할 기회가 없다는 것입니다.

하나의 쉬운 해결책은 이미 배열이없는 경우 배열 끝에 0을 추가하는 것입니다. 이렇게하면 루프가 만나는 마지막 값은 항상 0이되어 평균을 표시하는 데 필요한 조건과 일치합니다.

그것이 가능하지 않은 경우, 당신은 배열의 끝에 도달 할 때 루프가 중단되지 만들 수있는, 그래서 while 루프가 있다면, 그것은 본질적된다 :

while (true) ... 

그런 다음 당신은 당신의 첫 번째 조건 변경 여기까지 :

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

그래서 배열 끝에 도달하지 않은 경우에만 일치합니다. 그렇지 않으면 평균을 표시하는 것으로 떨어집니다.

평균 코드의 끝에서 배열의 끝에 도달했는지 확인하고 루프에서 빠져 나오는지 다시 확인하십시오.

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

이러한 변화는 혼자가 제공 한 샘플 코드를 수정되지 않지만 실제 코드는 질문에 설명한 기능과 일치하는 경우는 도움이 될 수 있습니다.

관련 문제