Elemente synchron aus zwei Arrays entfernen

Hallo Forum,

ich würde gerne das sehr nützliche Modul „Variablenvergleich“ modifizieren, mit dem ich die Abhängigkeit des Gasverbrauchs von der Aussentemperatur berechne. Im Prinzip funktioniert das Modul sehr gut, aber über ein ganzes Jahr gesehen sind auch viele Daten ausserhalb der Heizperiode drin welche den Kurvenfit verfälschen.

Meine Änderung soll darin bestehen, nur die x- und y-Werte zu berücksichtigen, bei denen die Aussentemperatur über 15 Grad lag.

Nachfolgend ist der Originalcode angehängt, dort wird die Temperatur in das Array $valuesX und der Gasverbrauch in das Array $valuesY eingetragen. Mit meinen PHP-Anfängerskills scheitere ich nun daran, die Werte bei Temperaturen > 15 synchron aus beiden Arrays zu entfernen. Teil meiner Verwirrung ist auch die Frage, ob man auf über diesen Arraytyp per Index iterieren kann.

Wäre klasse wenn mir jemand helfen könnte.

Viele Grüße
Volker

                    $startDate = $this->GetValue('StartDate');
                    $endDate = $this->GetValue('EndDate');
                    $rawX = AC_GetAggregatedValues($archiveID, $xVariableId, $this->ReadPropertyInteger('AggregationLevel'), $startDate, $endDate, 0);
                    $xVarValues = [];
                    foreach ($rawX as $dataset) {
                        $xVarValues[] = $dataset['Avg'];
                    }
                    $valuesX = array_reverse($xVarValues);

                    $rawY = AC_GetAggregatedValues($archiveID, $yVariableId, $this->ReadPropertyInteger('AggregationLevel'), $startDate, $endDate, 0);
                    $yVarValues = [];
                    foreach ($rawY as $dataset) {
                        $yVarValues[] = $dataset['Avg'];
                    }
                    $valuesY = array_reverse($yVarValues);

Hi,
ich schätze das würde nur gehen wenn beide Werte zur selben Zeit ud im selben Intervall ins Archive geschrieben werden. Ich befürchte Du musst es über die Zeit machen und dann für jede Temperatur > 15 die passenden Einträge beim Gas suchen.

Ralf

Hallo Ralf,

danke für deine Antwort! Die beiden Datensätze werden täglich zeitgleich geschrieben, das ist also kein Problem weil die bereits synchron sind. Die synchronen Datenpaare sind auch Voraussetzung damit dieses Modul sinnvoll arbeitet.

Meine Aufgabe jetzt ist wirklich nur das Entfernen der Einträge mit jeweils gleichem Index aus beiden Arrays, wenn der jeweilige Wert in ValuesX über 15 liegt. Also dort wo Temperatur>15 ist den Temperaturwert und den Gasverbrauch (gleicher Index) aus dem Temperaturarray (valuesX) und Verbrauchsarray (valuesY) löschen.

Viele Grüße
Volker

Hier mal ein Versuch, der nicht funktioniert hat (Modul mit diesem geänderten Code funktioniert nicht):

                    $startDate = $this->GetValue('StartDate');
                    $endDate = $this->GetValue('EndDate');
                    $rawX = AC_GetAggregatedValues($archiveID, $xVariableId, $this->ReadPropertyInteger('AggregationLevel'), $startDate, $endDate, 0);
                    $xVarValues = [];
                    foreach ($rawX as $dataset) {
                        $xVarValues[] = $dataset['Avg'];
                    }
                    $valuesX = array_reverse($xVarValues);

                    $rawY = AC_GetAggregatedValues($archiveID, $yVariableId, $this->ReadPropertyInteger('AggregationLevel'), $startDate, $endDate, 0);
                    $yVarValues = [];
                    foreach ($rawY as $dataset) {
                        $yVarValues[] = $dataset['Avg'];
                    }
                    $valuesY = array_reverse($yVarValues);


                    // Volker modification
                    $filteredValuesX = [];
                    $filteredValuesY = [];

                    $valueCount = count($valuesX);
                    for ($i = 0; $i < $valueCount ; $i++) {
                      $xval = $valuesX[i];
                      $yval = $valuesY[i];
                      if ($xval < 15.0) {
                        $filteredValuesX[] = $xval;
                        $filteredValuesY[] = $yval;
                      }
                    }

                    $valuesX = $filteredValuesX;
                    $valuesY = $filteredValuesY;

Hat sich erledigt, ich versuche es jetzt anders zu lösen.

In meinem Code im vorherigen Beitrag war ein banaler Fehler mit Index i anstatt $i. Das synchrone Ausdünnen der Arrays hat jetzt funktioniert, aber im Modul kommt es dann zu anderen Fehlern. Ist wohl doch komplexer das für meine Zwecke umzubauen.

Dann an dieser Stelle nur nochmal „Werbung“ für das Modul „Variablenvergleich“ von Sunnyka98, mit dem sich u.a. die Kennlinie Gasverbrauch vs. Aussentemperatur bestimmen lässt. Ich nutze das zur Heizungsoptimierung und Simulation: Welche Verbrauch hätten wir in der vergangenen Periode gehabt (geloggte Tagesmittelwerte der Aussentemperatur) mit den aktuellen Heizungseinstellungen (-> Kennlinien)? Funktioniert wunderbar.