Variablenamen in Schleife automatisch ändern

Hallo,

ich habe folgendes Programmteil, das ich gerne in eine Schleife packen möchte. Nun soll der Variablenamen „Zeitprogramm…x…_Zeit“ automatisch, das x geändert werden, geht das ? Es soll den Zähler der Schleife erhalten ?

	setValue($ID_Zeitprogramm1_Zeit		, $Zeitprogramm_Woche[date("w")][1]);
	setValue($ID_Zeitprogramm1_Solltemp	, $Zeitprogramm_Woche[date("w")][2]);
	setValue($ID_Zeitprogramm1_aktiv		, $Zeitprogramm_Woche[date("w")][3]);

	setValue($ID_Zeitprogramm2_Zeit		, $Zeitprogramm_Woche[date("w")][4]);
	setValue($ID_Zeitprogramm2_Solltemp	, $Zeitprogramm_Woche[date("w")][5]);
	setValue($ID_Zeitprogramm2_aktiv		, $Zeitprogramm_Woche[date("w")][6]);

	setValue($ID_Zeitprogramm3_Zeit		, $Zeitprogramm_Woche[date("w")][7]);
	setValue($ID_Zeitprogramm3_Solltemp	, $Zeitprogramm_Woche[date("w")][8]);
	setValue($ID_Zeitprogramm3_aktiv		, $Zeitprogramm_Woche[date("w")][9]);

	setValue($ID_Zeitprogramm4_Zeit		, $Zeitprogramm_Woche[date("w")][10]);
	setValue($ID_Zeitprogramm4_Solltemp	, $Zeitprogramm_Woche[date("w")][11]);
	setValue($ID_Zeitprogramm4_aktiv		, $Zeitprogramm_Woche[date("w")][12]);

Gruß Uwe

Hallo Uwe,

ja das geht. Dann sieht deine Variable als Beispiel so aus:


${'id_'.$var}

Probier das mal.

Hi Martin,

danke es geht.

getValue(${'ID_Zeitprogramm'.$key.'_Zeit'});

Gruß Uwe

Mich hat man schon geschlagen wegen diesr „variablen Variablen“.

Wäre das nicht ein typischer Anwendungsfall von Arrays?

Es macht den vielleicht Code besser lesbar und auch das Debugging im Falle, das etwas nicht funzt ist viel einfacher, weil Du mit print_r() eine ganze Struktur ausgeben kannst.

Wenn Du dann noch im Array $Zeitprogramm_Woche[date(„w“)] statt durchnumerieren mit denselben Indizes (Keys) wie „vorne“ (Zeit, Solltemp, Aktiv) arbeitest, wird es auch logisch in zwei Jahren noch leicht zu verstehen sein, „was auf was“ abgebildet wird.

So in etwa:


// DEFINITION ZEITPROGRAMME
$Zeitprogramm_woche[1]['Zeit'] = ...
$Zeitprogramm_woche[1]['Solltemp'] =  ...
$Zeitprogramm_woche[1]['aktiv'] = ...

[...]

// DEFINITION IPS-IDs
$Zeitprogramm[1]['ID']['Zeit'] = ...
$Zeitprogramm[1]['ID']['Solltemp'] =  ...
$Zeitprogramm[1]['ID']['aktiv'] = ...

[...]

$woche = date("w");
foreach( $Zeitprogramm as $IDArr )
{
	foreach( $IDArr as $key => $ID )
	{
		setValue($ID, $Zeitprogramm_Woche[ $woche ][ $key ]);
	};
};


bloss so ne idee …

jwka

Hi jwka,

diese Idee hatte ich auch, und es ist auch schon umgesetzt. Aber bei Dir sieht es übersichtlicher aus. Ich hänge gleich mal mein Array hier an.

Jetzt muß ich nur sehen wie ich von Dashboard auf die einzelnen Daten im Array zugreifen / ändern kann ?

Gruß Uwe

Dashboard bin ich leider komplett unterbelichtet. Steht irgendwo auf meiner ellenlangen Liste …

jwka

Hier mal das Array, in IPS Editor sieht es besser aus.

	$Zeitdaten = array("Zeiten" =>array("0" => array("06:00","12:00","18:00","22:00"),	// Sonntag
	                                 	"1" => array("06:01","12:00","18:00","22:00"),  // Montag
   	                              	"2" => array("06:02","12:00","18:00","22:00"),  // Dienstag
      	                           	"3" => array("06:03","12:00","18:00","22:00"),  // Mitwoch
         	                        	"4" => array("06:04","12:00","18:00","22:00"),  // Donerstag
            	                     	"5" => array("06:05","12:00","18:00","22:00"),  // Freitag
               	                  	"6" => array("06:06","12:00","18:00","22:00")), // Samstag
						"Sollwert" => 	array("0" => array("22,0","21,0","22,5","19,0"),   	// Sonntag
						                     "1" => array("22,0","21,0","22,5","19,0"),
						                     "2" => array("22,0","21,0","22,5","19,0"),
						                     "3" => array("22,0","21,0","22,5","19,0"),
						                     "4" => array("22,0","21,0","22,5","19,0"),
						                     "5" => array("22,0","21,0","22,5","19,0"),
					   	                  "6" => array("22,0","21,0","22,5","19,0")),
						"Aktiv" => 		array("0" => array("true","true","true","true"),     	// Sonntag
						                     "1" => array("true","true","true","true"),
						                     "2" => array("true","true","true","true"),
						                     "3" => array("true","true","true","true"),
						                     "4" => array("true","true","true","true"),
						                     "5" => array("true","true","true","true"),
					   	                  "6" => array("true","true","true","true")));

Was jetzt kommt ist einerseits ganz arg ne Geschmacksfrage und auch ein bischen, für was Du die Daten noch so brauchst … also nur als Denkanstoss werten:

Mit Deinem „Model“ musst Du ziemlich aufpassen und abzählen, damit Du nicht versehentlich bei ner Änderung die Temperatur (nehme ich an) an der falschen Stelle änderst.

Mit einer anderen Anordnung wäre das evtl. schon auf den ersten Blick leichter:


$Zeitdaten[ 'Sonntag' ]['06:00']['Sollwert'] = 22,0;
$Zeitdaten[ 'Sonntag' ]['06:00']['Aktiv'] = 1;

Ferner könnte man evtl. auch auf das „aktiv“ verzichten, wenn man eine Temperatur (z.B. 0) als „inaktiv“ interpretiert. Dann hast Du nur eine Zeile.

Weiterer Vorteil wäre, dass Du auch an unterschiedliehcn Tagen unterschiedliche Anzahl von Temperaturwerten haben kannst, was in Deiner Struktur schwieriger wird.

Irgend einer hier hat mich mal Fummler genannt und deshalb packe solche „Tables“ oft in eine Kurzstruktur, die ich später mit explode() auftrenne:


// Uhrzeit#VorlaufSoll#aktiv_oder_nicht;
$Zeitdaten[ 'Sonntag' ][] = "09:00#22,0#1";
$Zeitdaten[ 'Sonntag' ][] = "22:00#20,0#1"; // Nachtabsenkung
$Zeitdaten[ 'Montag' ][] = "06:00#22,0#1";
$Zeitdaten[ 'Montag' ][] = "09:00#21,0#1";
$Zeitdaten[ 'Montag' ][] = "12:00#22,0#1"; // Mittagspause
$Zeitdaten[ 'Montag' ][] = "14:30#21,0#1";
$Zeitdaten[ 'Montag' ][] = "17:00#22,0#1";
$Zeitdaten[ 'Montag' ][] = "21:00#20,0#1"; // Nachtabsenkung

Hat natürlich den Nachteil dass es wieder schlechter zu lesen ist.

jwka

Hi,

Mit aktiv bezwecke ich, das ich 4 Schaltpunkte pro Tag habe. Im Bad brauche ich alle 4 im Büro aber nur 2, ich schalte dann die nicht benötigten mit aktiv aus. Bei 0.0 Grad wäre das HeizungsVentile ganz aus.

Ja die Struktur gefällt mir irgend wie auch noch nicht.

Gruß Uwe

Dann müßte es so gehen, ansonsten kann ich die Zeiten nicht ändern.

$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 1']['Zeit'] 		= "06:00";
$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 1']['Sollwert'] 	= "22.0";
$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 1']['aktiv'] 		= "true";

$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 2']['Zeit'] 		= "12:00";
$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 2']['Sollwert'] 	= "21.0";
$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 2']['aktiv'] 		= "true";

$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 3']['Zeit'] 		= "06:00";
$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 3']['Sollwert'] 	= "22.5";
$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 3']['aktiv'] 		= "true";

$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 4']['Zeit'] 		= "12:00";
$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 4']['Sollwert'] 	= "19.0";
$Zeitdaten[ 'Sonntag' ]['Schaltpunkt 4']['aktiv'] 		= "true";

Klar geht das so und ist auch recht stringent, allerdings … (Geschmacksfrage)

Das Blank würde ich perönlich nicht machen, eher Unterstrich oder Punkt (wenn Du nur Zeichen nimmst, die auch als Variablenname gültig sind, kannst Du das Array auch mal als Parameter bei IPS_RunScriptEx benutzen) …

Mit dem Verschieben der Uhrzeit in der Wertbereich (statt Key) erreichst Du ne einfache Abfragemöglichkeit dieser Uhrzeit. Ich habe aber nirgeds gesehen, dass Du das abgefragt hast, jedenfalls nicht aus dem Array …

jwka

Hi Jwka,

hier mal wie ich das momentan auslese. Problem wird sein, aus dem Dashboard die Einträge zu ändern.

<?

$Tag_Namen = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");

$Zeitdaten['Sonntag'		]	[] = "06:00#22.0#true";
$Zeitdaten['Sonntag'		]	[] = "11:00#21.0#true";
$Zeitdaten['Sonntag'		]	[] = "18:00#22.0#true";
$Zeitdaten['Sonntag'		]	[] = "22:00#19.0#true";

$Zeitdaten['Montag'		]	[] = "06:01#22.0#true";
$Zeitdaten['Montag'		]	[] = "11:01#21.0#true";
$Zeitdaten['Montag'		]	[] = "18:01#22.0#true";
$Zeitdaten['Montag'		]	[] = "22:01#19.0#true";

$Zeitdaten['Dienstag'	]	[] = "06:02#22.0#true";
$Zeitdaten['Dienstag'	]	[] = "11:02#21.0#true";
$Zeitdaten['Dienstag'	]	[] = "18:02#22.0#true";
$Zeitdaten['Dienstag'	]	[] = "22:02#19.0#true";

$Zeitdaten['Mittwoch'	]	[] = "06:03#22.0#true";
$Zeitdaten['Mittwoch'	]	[] = "11:03#21.0#true";
$Zeitdaten['Mittwoch'	]	[] = "18:03#22.0#true";
$Zeitdaten['Mittwoch'	]	[] = "22:03#19.0#true";

$Zeitdaten['Donnerstag'	]	[] = "06:04#22.0#true";
$Zeitdaten['Donnerstag'	]	[] = "11:04#21.0#true";
$Zeitdaten['Donnerstag'	]	[] = "18:04#22.0#true";
$Zeitdaten['Donnerstag'	]	[] = "22:04#19.0#true";

$Zeitdaten['Freitag'		]	[] = "06:05#22.0#true";
$Zeitdaten['Freitag'		]	[] = "11:05#21.0#true";
$Zeitdaten['Freitag'		]	[] = "18:05#22.0#true";
$Zeitdaten['Freitag'		]	[] = "22:05#19.0#true";

$Zeitdaten['Samstag'		]	[] = "06:06#22.0#true";
$Zeitdaten['Samstag'		]	[] = "11:06#21.0#true";
$Zeitdaten['Samstag'		]	[] = "18:06#22.0#true";
$Zeitdaten['Samstag'		]	[] = "22:06#19.0#true";

//print_r($Zeitdaten);


//---Nächster Schaltpunkt aus Array auslesen------------------------------------
$Wochentag = $Tag_Namen[date("w") + 0];

foreach ($Zeitdaten[$Wochentag] as $key => $i ){
      $Zeit = DatenArrayLesen($Wochentag, $key, 0);                              // 0 = Zeit / 1 = Sollwert / 2 = aktiv
		if ($Zeit > date("H:i")) {
 	   	$Zeit 				= DatenArrayLesen($Wochentag, $key, 0);               // 0 = Zeit / 1 = Sollwert / 2 = aktiv
			$Sollwert 			= DatenArrayLesen($Wochentag, $key, 1);               // 0 = Zeit / 1 = Sollwert / 2 = aktiv
			$Sollwert_aktiv 	= DatenArrayLesen($Wochentag, $key, 2);               // 0 = Zeit / 1 = Sollwert / 2 = aktiv
			//print $Zeit." ".$Sollwert." ".$Sollwert_aktiv;
			break;
		}
}

//---Angegebenen Schaltpunkt aus Array auslesen---------------------------------
function DatenArrayLesen($Wochentag, $Datensatz_NR, $Datensatz_Tag_NR_Wert){
	global $Zeitdaten;

	$Datensatz_Tag_NR		= $Zeitdaten[$Wochentag][$Datensatz_NR];
	$Datensatz_Tag_Array = explode("#", $Datensatz_Tag_NR);                          
	$Wert 					= $Datensatz_Tag_Array[$Datensatz_Tag_NR_Wert];

	return($Wert);
}



?>

Frage schon beantwortet.