Moin!
1.) United hat recht und von mir sein [+] bekommen.
2.) So. Jetzt der Spaß mit dem Interpolieren zwischen den Messpunkten, diese bleiben also als Stützen und dazwischen wird linear interpoliert. Hat also Zacken, die "Linie".
Ist ein Kindrspiel wenn man array_shift() kennt.
array_shift liefert den Wert und löscht das erste Elemnt des Arrays, setzt danach aber das erste auf den Index 0!) So wie ich das gelöst habe ist das aber egal ... denn die Arrays dienen zum Wegwerfen.
In der Schleife wird geprüft, ob x einem der Unterstützungspunkte entspricht, wenn ja wird der Wert (y) zurückgeliefert. Schlagen diese Fehl, dann wird geprüft, ob x zwischen dem kleinsten noch bekannten Untertützungspunkt und dem nächsten liegt.
Wenn ja: interpolieren. wenn nein: bisheriger nächster Punkt wir früherer Punkt, neuer nächster Punkt wird aus Arrays geholt und in den Arrays gelöscht, das spart Schleifen und Speicher. Danach wird natürlich interpoliert, denn einer der Messpunkte kann es logisch nicht sein:
<?php
# Eingangsdaten:
$ar[strtotime("2015-01-01T06:00:00")]=1224.167;
$ar[strtotime("2015-01-01T06:15:00")]=1344.207;
$ar[strtotime("2015-01-01T06:30:00")]=1524.367;
$ar[strtotime("2015-01-01T06:45:00")]=1555.707;
$arKeys = array_keys($ar);
$start = $arKeys[0];
$ende = $arKeys[count($arKeys)-1];
$step=60; # Sekunden
$step=60; # Sekunden
# die zuletzt gesehenen Punkte (x0,y0 ; x1,y1) weren für den Start definiert
# außerhalb vin diesen ist eine INTERpolation unzulässig, sonst wäre es eine
# Extrapolation ...
$x0 = array_shift($arKeys);
$y0 = array_shift($ar);
$x1 = array_shift($arKeys);
$y1 = array_shift($ar);
for ($x=$start; $x<=$ende; $x=$x+60) {
$y=false;
if ($x == $x0) {
$y=$y0;
} elseif ($x == $x1) {
$y=$y1;
} elseif ( $x > $x0 && $x < $x1 ) {
$y = lineareInterpolation ($x, $x0, $y0, $x1, $y1);
} else {
# Löschen des jeweils kleinsten (ersten) ArrayElements:
$x0 = $x1;
$y0 = $y1;
$x1 = array_shift($arKeys);
$y1 = array_shift($ar);
$y = lineareInterpolation ($x, $x0, $y0, $x1, $y1);
}
echo $x, "\t", $y, "\n";
}
function lineareInterpolation ($x, $x0, $y0, $x1, $y1) {
return ($y0 * ($x1-$x) / ($x1-$x0)) + ($y1 * ($x-$x0) / ($x1-$x0));
}
Ergebnis:
1420088400 1224.167
1420088460 1232.1696666667
1420088520 1240.1723333333
1420088580 1248.175
1420088640 1256.1776666667
1420088700 1264.1803333333
1420088760 1272.183
1420088820 1280.1856666667
1420088880 1288.1883333333
1420088940 1296.191
1420089000 1304.1936666667
1420089060 1312.1963333333
1420089120 1320.199
1420089180 1328.2016666667
1420089240 1336.2043333333
1420089300 1344.207
1420089360 1356.2176666667
1420089420 1368.2283333333
1420089480 1380.239
1420089540 1392.2496666667
1420089600 1404.2603333333
1420089660 1416.271
1420089720 1428.2816666667
1420089780 1440.2923333333
1420089840 1452.303
1420089900 1464.3136666667
1420089960 1476.3243333333
1420090020 1488.335
1420090080 1500.3456666667
1420090140 1512.3563333333
1420090200 1524.367
1420090260 1526.4563333333
1420090320 1528.5456666667
1420090380 1530.635
1420090440 1532.7243333333
1420090500 1534.8136666667
1420090560 1536.903
1420090620 1538.9923333333
1420090680 1541.0816666667
1420090740 1543.171
1420090800 1545.2603333333
1420090860 1547.3496666667
1420090920 1549.439
1420090980 1551.5283333333
1420091040 1553.6176666667
1420091100 1555.707
Jörg Reinholz