2

一致するデータの配列が 2 つあります。1 つは値、もう 1 つは時間です。時間を最も近い 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。また、その配列の値の一部はゼロ以下であり、それらが平均を表示するポイントであると想定しています。

問題は、最後の値セットの平均を表示する機会がなくても、ループが配列の最後に到達することです。

簡単な解決策の 1 つは、配列の末尾にゼロが存在しない場合は、末尾にゼロを追加することです。そうすれば、ループが遭遇する最後の値は常にゼロになり、平均を表示するために必要な条件に一致します。

それが不可能な場合は、ループが配列の最後に到達しても停止しないようにすることができます。そのため、while ループの場合は、基本的に次のようになります。

while (true) ...

次に、最初の条件を次のように変更します。

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

したがって、配列の最後を超えていない場合にのみ一致します。それ以外の場合は、平均を表示することになります。

そして、平均コードの最後に、別のチェックを追加して、配列の終わりを過ぎたかどうかを確認し、ループから抜け出します。

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

これらの変更だけでは、提供したサンプル コードは修正されませんが、実際のコードが質問で説明した機能と一致する場合は役立つ場合があります。

于 2013-05-27T20:27:14.420 に答える