Array aus pdo Abfrage läuft nur einmal

Hi,

range() war auch Quatsch. Du musst ja erstmal ein Array gefüllt mit Nullen erstellen:

PHP:
$points = array_fill(0, $resolution, 0);

Du darfst gerne mitdenken. ;)

LG
 
Hi,

ich meinte eher den (genauen) Code nach meiner Version.
Was ich mich aber frage, ist, wo Du in Deinem Code eine Auflösung von 360 Datenpunkten festlegst.
Was soll der Wert Deiner Variablen $mwfaktor_dp darstellen und warum durchläufst Du die Schleife in 60-Sekunden-Schritten? Was ist mit möglichen Messwerten dazwischen? Lässt Du die unter den Tisch fallen? Meine Abfrage tut dies nicht, sondern bezieht alle Werte in die Berechnung ein.

LG
 
Die Daten werden Minütlich aufgezeichnet.
$mwfaktor_dp ist der Mittelungswert.
Bei einem Tag z.B. ist er 4, d.h. es wird der Mittelwert aus 4 aufeinanderfolgenden Werten errechnet.
=>1440/4=360

PHP:
$startdatum = mktime(0, 0, 0, $in[month], $in[day], $in[year]);
$enddatum = mktime(0, 0, 0, $out[month], $out[day], $out[year]);
$enddatum += 86400;
$diff = $enddatum - $startdatum;
$mwfaktor_dp = round ($diff / 86400) * 4;


$rain_result = $db_pdo->prepare("SELECT rain_date, rain_mm, rain_time FROM rain WHERE (rain_timestamp between $startdatum AND $enddatum AND rain_place = 1) ORDER BY rain_date, rain_time");
$rain_result->execute();
$row = $rain_result->fetchAll(PDO::FETCH_ASSOC);

$i=0;


$dp_row = array();

foreach ($row as $row2) {

    $dp_row[$row2[rain_date].$row2[rain_time]] = $row2[rain_mm];

}


$n = 0;
$ba = 0;
$s = 1;
$m=0;
$mw_array = array();


for ($i = $startdatum; $i < $enddatum; $i += 60) {

    if ($s != $mwfaktor_dp) {
        $mw += $dp_row[date("Y-m-dH:i:s", $i)];
        $s++;
    }
    
    else {
        $mw /= $mwfaktor_dp;
        $m++;
        $s = 1;
        array_push ($mw_array, $mw);
        unset ($mw);
    } 

    $n++;
    
    $vdate = date("Y-m-d", $i);
    $vtime = date("H:i:s", $i);

    if (!empty($dp_row[date("Y-m-dH:i:s", $i)])) {
        $ba++;
    }
}

PHP:
$start = mktime(0,0,0,$in[month], $in[day], $in[year]);
$end = mktime(0,0,0,$out[month], $out[day], $out[year]);
$end += 86400;

$rain_result = $db_pdo->prepare("SELECT (rain_timestamp - $start) * 359 DIV ($end - $start) AS interval_nr,
   AVG(rain_mm) AS wert FROM rain
   WHERE (rain_timestamp between $start AND $end AND rain_place = 1)
   GROUP BY interval_nr
   ORDER BY rain_timestamp ASC");

$rain_result->execute();
$n=0;
  $points = array_fill(0, 359, 0);

while ($row = $rain_result->fetch(PDO::FETCH_ASSOC)) {
    
    $points[$row[interval_nr]] = $row[wert];

}
 
Es ist komisch, wenn ich 8.3.08-8.3.08 abrufe -> 360.
Bei 8.3.08-14.6.08 -> 359.

Das ist ein UNIX Timestamp

Deine Variante ist natürlich schneller, aber die Werteunterschiede sind schon gewaltig. Ich werd mal schauen, ob ich da etwas finde.
 
Ich meinte im Code. In der DB-Abfrage musst Du das auch DIV 360 rechnen, sonst teilst Du den Zeitraum in 359 Intervalle, nicht in 360. Und array_fill() möchte als 2. Parameter die Anzahl Elemente, wobei das nicht das Problem ist.
Die Abfrage funktioniert bei mir mit einer Handvoll Testdaten perfekt.

LG
 
So. Mal länger draufgeschaut und schon ist klar, wo die unterschiedlichen Werte herkommen. Du mittelst die Messwerte über die Anzahl Minuten pro Intervall. Da ich aber anfangs gar nicht wusste, mit welcher Abtastrate gemessen wird, habe ich einfach über die Anzahl gemessener Werte gemittelt.

Ersetze mal AVG(rain_mm) durch SUM(rain_mm)/$mwfaktor_dp, dann sollte es schon besser aussehen.

LG
 
Zurück