switch-case

Hallo,

ich möchte die Level-Variable anhand einer switch-Anweisung in Text umsetzen.

Obwohl ich die Eingabe explizit auf 0.0 setze, kommt immer der Wert „geschlossen“ raus. Das echo von $totaltime zeigt 0 an…
Bin ich blind oder wo ist da der Codierfehler ?


<?


$totaltime = GetValueFloat(15412 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\BLIND\LEVEL]*/);
$totaltime = 0.0;

switch ($totaltime) {

case ($totaltime == 0.0):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "geöffnet"); // Positionsvariable setzen
break;

case ($totaltime <= 0.4):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "Lichtschutz"); // Positionsvariable setzen
break;

case ($totaltime <= 0.6):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "halb geöffnet"); // Positionsvariable setzen
break;

case ($totaltime < 1.0):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "Sonnenschutz"); // Positionsvariable setzen
break;

case ($totaltime == 1.0):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "geschlossen"); // Positionsvariable setzen
break;

default:
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "unbekannt"); // Positionsvariable setzen
}

echo $totaltime;
echo GetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/);

?>

Das sollte so langsam jedem mal klar sein. :mad:

<?


$totaltime = GetValueFloat(15412 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\BLIND\LEVEL]*/);
$totaltime = 0.0;

switch ($totaltime) {

case ($totaltime == 0.0):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/ , "geöffnet"); // Positionsvariable setzen
break;

case ($totaltime <= 0.4):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/ , "Lichtschutz"); // Positionsvariable setzen
break;

case ($totaltime <= 0.6):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/ , "halb geöffnet"); // Positionsvariable setzen
break;

case ($totaltime < 1.0):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/ , "Sonnenschutz"); // Positionsvariable setzen
break;

case ($totaltime == 1.0):
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/ , "geschlossen"); // Positionsvariable setzen
break;

default:
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/ , "unbekannt"); // Positionsvariable setzen
}

echo $totaltime;
echo GetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/);

?> 

hm - lt. PHP-Syntax ist der Doppelpunkt aber schon richtig…aber mit einem Strichpunkt erhalte ich allerdings das gleiche falsche Ergebnis…oder habe ich was missverstanden ?

ne ne : ist schon richtig.

und kannst du einen Fehler erkennen ? Wenn ich 0.4 oder 0.8 eingebe, klappts komischerweise …

Denke eher so,

case  0.0:
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/ , "geöffnet"); // Positionsvariable setzen
break;

case  0.4:
SetValueString(17478 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/ , "Lichtschutz"); // Positionsvariable setzen
break;

ja, aber so prüfe ich ja direkte Werte ab, aber ich möchte ja Intervalle abfragen, denn der Rollladen kann ja auch bei 0.47 stehen bleiben und dann habe ich kein Ergebniswert.

du müsstest vorher Variablen setzen können, die das aussagen, wenn man im CASE tatsächlich kein <= verwenden kann (das habe ich nicht geprüft und nicht nachgelesen).

Ganz grob etwas so:


$zwischen0und04 = FALSE;
if ($totaltime >= 0 && $totaltime <=0.4) {$zwischen0und04 = TRUE;}

$zwischen04und06 = FALSE;
if ($totaltime > 0.4 && $totaltime <=0.6) {$zwischen04und06 = TRUE;}


Diese Boolean Variablen kannst Du dann auf jeden Fall im CASE verwenden. Keine Ahnung, ob es noch einfacher geht … Für solche anspruchsvollen Fragen ist es einfach schon zu spät :frowning:

hm - die Abfragetechnik habe ich aus dem PHP-Manual im Netz…und wie gesagt, bei Zwischenwerten wie 0.47 oder 0.85 funktioniert das ganze einwandfrei - nur bei 0 tut er so, als ob es 1 wäre :confused:

Habe gerade mal gespielt … :o

Wenn ich den Wert in Hochkomma setze funktioniert es :

$totaltime = '0.0';

Gruß
Bruno

Alternative und kürzere Schreibweise die funktioniert:


$totaltime = 0.0;

($totaltime  == 0.0) ?      SetValueString(20968 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "geöffnet")             :
(($totaltime <= 0.4) ?      SetValueString(20968 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "Lichtschutz")     :  
(($totaltime == 1.0) ?      SetValueString(20968 /*[Rollladen/Markisen\Rollladen Schlafzimmer links\Rollladen Schlafzimmer links Position]*/  , "geschlossen") : ""));

etc.:wink:

wow - am frühen Morgen schon so aktiv ? :smiley:
zunächst danke an Ferengi-Master für das Taggen meines Beitrags und für den Code-Vorschlag…(ist das noch PHP ?)

@Powerfreddy: mit deiner Lösung mache ich doch die Variable zu einem String, den ich dann später wieder gegen eine Float-Variable vergleiche, oder ?
Normalerweise kommt der Wert aus einer Funktion GetValueFloat(Level) - dann ist es doch auch eine Float-Variable - insofern verstehe ich nicht, warum das über den String besser funktioniert (und vor allem, warum es bei „krummen“ Werten klappt und bei 0.0 nicht) .

…(ist das noch PHP ?)

Ja ist es.:smiley:

ist dies das sogenannte inline-if ?
Die Klammerungen verwirren mich leicht - stimmen die so ?

ja, die Klammern dürften so stimmen.

Setzt es einfach mal ein und teste es :slight_smile:

$totaltime = 0.0;

($totaltime  == 0.0) ?      SetValueString(20968   , "geöffnet")             :
(($totaltime <= 0.4) ?      SetValueString(20968   , "Lichtschutz")     : 
(($totaltime <= 0.6) ?      SetValueString(20968   , "halb geöffnet")     : 
(($totaltime < 1.0)  ?      SetValueString(20968   , "Sonnenschutzschutz") : "geschlossen")));  

so, oder müssen da jetzt noch mehr Klammern an die unteren Abfragen?

na jetzt bei 4 zeilen fehlt doch eine Klammer hinten, oder?

hab mal noch eine (in rot) dazu gemacht - heute Abend wird getestet :o

Ich hätte Klammern für 5€ / Stück im Angebot.:smiley:

ist dies das sogenannte inline-if ?

Das ist ein Trinitäts-Operator.

http://www.php.net/manual/de/language.operators.comparison.php

Hatte die Antwort doch schon gegeben, „nur gespielt …“ :smiley:

Irgend ein Problem ist es halt mit dem Wert „0“. Der weitere technische Hintergrund fehlt mir (noch ?). War mir aber bisher meist egal, wenns lief. :rolleyes:

Gruß
Bruno