mike: Schleife

Hallo.

Würde gerne wissen ob das so geht wie ich es gamcht habe.

  
.  
.  
.  
    $count = 1; //Counter Startwert festlegen  
    while($count < 5) /Schleife 5mal durchlaufen  
    {  
    sleep(1); // 1 Sekunden warten  
    $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen"); //Werte lesen  
    if (isset($_COOKIE["data"])){ break; } //prüfen ob Daten von homestudio empfangen wurden, dann abbrechen  
    $count++; //Zähler um 1 erhöhen  
    }  
.  
.  
.  
.  

Die Schleife soll 5mal durch laufen werden, wenn kein Rückgabewert von GetStudioArray kommt. Wird vorher ein Rückgabewert geliefert, so soll die Schleife beendet werden.

Danke für die Hilfe.

mfg mike

  1. Sorry, hatte noch alten Code im Zwischenspeicher. So ist es:

      
    .  
    .  
    .  
    .  
      <?php  
      
        include("interface.home.studio/homeputer.studio.interface.php"); //Interface einbinden  
      
        $count = 1; //Counter Startwert festlegen  
        while($count < 5) //Schleife 5mal durchlaufen  
        {  
        sleep(1); // 1 Sekunden warten  
        $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen"); //Werte lesen  
        if (isset($data)){ break; }else{ echo "Fehler"; } //prüfen ob Daten von homestudio empfangen wurden, dann abbrechen  
        $count++; //Zähler um 1 erhöhen  
        }  
      
        //Werte manipulieren für bessere lesbarkeit  
        if ($data["KS_300_Regen"] == "an")   $data["KS_300_Regen"] = $data["KS_300_RegenAStunde"] . " l/h";  
        if ($data["KS_300_Regen"] == "aus")  $data["KS_300_Regen"] = "n.v.";  
      
      ?>  
    .  
    .  
    .  
    .  
    
    
    1. Hi,

      Sorry, hatte noch alten Code im Zwischenspeicher.

      D'oh!

      $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen"); //Werte lesen

      if (isset($data)){ break; }

        
      Natürlich ist $data gesetzt, das hast du in der Zeile vor dem If gemacht.  
      (Je nachdem, was genau $data enthält, kann isset natürlich trotzdem false liefern.)  
        
      Vielleicht wäre es aber sinnvoller, wenn du abfragst, was genau $data enthält?  
      Wie genau, kommt natürlich darauf an, wie deine Definition von „hat keinen Rückgabewert geliefert“ aussieht.  
        
      MfG ChrisB  
        
      
      -- 
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      
      1. $data liefer false zurück, wenn etwas schief gegangen ist. Hier der Auszug aus dem Script. Sorry aber bin gerade erst ein paar Tage dabei und es fällt mir noch schwer. Danke!

          
        .  
        .  
        .  
        function GetStudioArray($objects) {  
        global $studio_server, $studio_port, $studio_timeout, $studio_password;  
        if ($socket = fsockopen($studio_server, $studio_port, $errno, $errstr, $studio_timeout)) {  
          $objects_array = explode(",", $objects);  
          for ($i=0; $i<count($objects_array); $i++) {  
        	  $objects_array[$i] = trim($objects_array[$i]);  
        	}  
          $command = "g" . implode(" g", $objects_array);  
          fputs($socket, trim("$studio_password $command") ."\r\n");  
          for ($i=0; $i<count($objects_array); $i++) {  
        	$data = trim(fgets($socket));  
        	if (substr(strtolower($data), 0, strpos($data, "=")) == strtolower($objects_array[$i])) {  
        	  $result[$objects_array[$i]] = substr($data, strpos($data, "=")+1);  
        	} else {  
        	  fclose($socket);  
        	  return(false);  
        	}  
          }  
          fclose($socket);  
          return($result);  
        } else {  
          return(false);  
        }  
        }  
        .  
        .  
        .  
        
        
        1. Hi,

          $data liefer false zurück, wenn etwas schief gegangen ist.

          Na dann, frag das doch einfach ab.

          Sollten auch Rückgabewerte möglich sein, die PHP als analog zu false betrachtet - dann ist ein typsicherer Vergleich (Stichwort) angebracht.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          1. Hallo!

            Na dann, frag das doch einfach ab.

            mache ich das nicht mit

            if (isset($data)){ break; }else{ echo "Fehler"; }

            ???

            mfg mike

            1. Moin!

              Hallo!

              Na dann, frag das doch einfach ab.

              mache ich das nicht mit

              if (isset($data)){ break; }else{ echo "Fehler"; }

              Nein. isset() fragt ab, ob eine Variable "gesetzt" ist. Das gilt nur dann nicht, wenn eine Variable undefiniert bleibt (hast du eine Zeile vorher getan) oder NULL enthält (du schreibst entweder FALSE oder ein Array rein).

              - Sven Rautenberg

              1. Danke, aber wie müsste ich das machen?
                Stehe etwas auf'n Schlauch.

                mfg mike

                1. Moin!

                  Danke, aber wie müsste ich das machen?
                  Stehe etwas auf'n Schlauch.

                  Wie du selbst gesagt hast, gibt deine Funktion entweder ein Array zurück, wenn alles geklappt hat, oder den Wert FALSE.

                  Und jetzt willst du abfragen, ob die Funktion erfolgreich war. Das kann man in verschiedenen Abfragen ausdrücken, die in konkret diesem Fall alle auf dasselbe Resultat hinauslaufen:

                  1. $data ist ein Array http://de.php.net/is_array
                  2. $data ist nicht FALSE
                  3. $data ist nicht "empty". http://de.php.net/empty

                  - Sven Rautenberg

                  1. Hallo und Danke!

                    Also dann so?

                      
                          $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen"); //Werte lesen  
                          if ($data=="false") { //prüfen ob Daten von homestudio empfangen wurden, wenn ja dann abbrechen  
                            ?> <meta http-equiv="refresh" content="0; URL=error.site/homeputer.studio.interface.01000.php"> <?php  
                          }else{  
                            break;  
                          }  
                          $count++; //Zähler um 1 erhöhen  
                        }  
                    
                    

                    mfg mike

                    1. Hi,

                      Also dann so?

                      $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen"); //Werte lesen

                      if ($data=="false") { //prüfen ob Daten von homestudio empfangen wurden, wenn ja dann abbrechen

                        
                      nein, du willst doch auf die Konstante false überprüfen, nicht auf einen String, der die Zeichenfolge "false" enthält.  
                        
                      Ciao,  
                       Martin  
                      
                      -- 
                      [Programmierer (m), seltener auch P~in (w)](http://community.de.selfhtml.org/zitatesammlung/zitat110):  
                      Irdische, i.a. humanoide Lebensform, die in einem komplizierten biochemischen Prozess Kaffee, Cola und Pizza in maschinenlesbaren Programmcode umwandelt.  
                      P~ bilden gelegentlich mit ihresgleichen kleine Gruppen, sogenannte Communities, sind aber ansonsten meist scheue Einzelgänger.  
                      P~ sind vorwiegend nachtaktiv und ohne technische Hilfsmittel nur eingeschränkt lebensfähig.  
                      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                      
                      1. Einach:

                        if !GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen"); break;

                        oder:

                        $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen");

                        if !$data; brak;

                        1. Also noch mal, sorry.

                          So frage ich es als String ab:

                          if ($data=="false") {...

                          Gut habe ich jetzt verstanden, es könnte auch Otto darin stehen.

                          So frage ich es als Booeleans ab:

                          if ($data==false) {...

                          oder auch

                          if ($data==true) wo bei ich true nicht bekomme, da mein Array ja gefüllt wird.

                          Das bedeutet: return false/true bedeutet nichts anderes, als dass die aufgerufene Funktion einen Rückgabewert in Form eines booleschen Wertes liefert.

                          Alternative könnte ich auch sgen:

                          if is_array($data) {...

                          oder

                          if (empty($data) == false) {...

                          So in etwa oder habe ich es noch immer nicht verstanden? :(

                          Habe es jetzt so im Code:

                            
                              $count = 1; //Counter Startwert festlegen  
                              while($count < 5) //Schleife 5mal durchlaufen  
                              {  
                                sleep(1); // 1 Sekunden warten  
                                $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen,  
                                                        EM_SC_BI_1114"); //Werte lesen  
                                if ($data==false) { //prüfen ob Daten von homestudio empfangen wurden, wenn ja dann abbrechen  
                                  ?> <meta http-equiv="refresh" content="0; URL=error.site/homeputer.studio.interface.01000.php"> <?php  
                                }else{  
                                  break;  
                                }  
                                $count++; //Zähler um 1 erhöhen  
                              }  
                          
                          

                          Danke für die Hilfe an alle!!!

                          mfg mike

                          1. Hi!

                            if ($data==false) {...
                            if ($data==true) [...]
                            if (empty($data) == false) {...
                            So in etwa oder habe ich es noch immer nicht verstanden? :(

                            Doch, sieht nach verstanden aus. Nur dass man statt der obigen drei einfacher

                            if (!$data)
                              if ($data)
                              if (!empty($data))

                            schreiben kann. Die obigen sind formuliert à la "Ist es wahr, dass $data wahr ist?" statt "Ist $data wahr?"

                            [Dein Code]

                            Wenn du nun noch die anderen Hinweise beachtest (for statt while, 5mal statt 4mal die Schleife durchlaufen, und $data kann man ganz wegkürzen), kommt gekürzt das raus:

                            for ($count = 0; $count < 5; $count++) {
                                sleep(1);
                                if (GetStudioArray(...))
                                  break;
                                ?> <meta...> <?php
                              }

                            Allerdings stellt sich mir die Frage, willst du wirklich bis zu 5 Meta-Refreshs ausgeben? Ich denke eher, dass du erst nach 5 erfolglosen Versuchen refreshen willst. Dann braucht es doch wieder eine Hilfsvariable.

                            for ($count = 0; $count < 5; $count++) {
                                sleep(1);
                                if ($data = GetStudioArray(...))
                                  break;
                              }
                              if ($data) {
                                ?> <meta...> <?php
                              }

                            Die Besonderheit hier ist, dass

                            if ($data = GetStudioArray(...)) {...}

                            kein Vergleich (==) sondern eine Zuweisung (=) ist. Das Ergebnis einer Zuweisung ist der Wert der Zuweisung. Also wenn GetStudioArray() ein Array liefert, steht einerseits dieses Array in $data und andererseits bekommt das if dieses Array zu sehen. Mit dem false funktioniert das genauso. Warum mach ich das so? Es wird sowohl das Ergebnis von GetStudioArray() benötigt, um nach der Schleife entscheiden zu können, ob das Meta-Element ausgegeben werden soll oder nicht. Außerdem muss entschieden werden, ob die Schleife abgebrochen werden soll.

                            Wenn dir das zu schwierig zu verstehen ist, nimm diese Variante:

                            $data = GetStudioArray(...);
                              if ($data) {...}

                            Die hat genau dieselbe Wirkung, nur eben in zwei Schritten.

                            Lo!

                            1. Super und Danke für die Erklärung.

                              Ich denke jetzt verstehe ich das ganze.

                              Verwende auch die kurze Schreibweise ;)

                              if ($data = GetStudioArray(...)) {...} das verstehe ich schon, aber finde es nicht so toll, aber evtl. Ändere ich ja meine Meinung noch :)

                              Die For Schleife habe ich jetzt auch genommen, ist natürlich echt besser in der Schreibweise. Danke.

                              Nochmals Danke an Eure Hilfe!

                              mfg mike

                              1. Moin!

                                Verwende auch die kurze Schreibweise ;)

                                if ($data = GetStudioArray(...)) {...} das verstehe ich schon, aber finde es nicht so toll, aber evtl. Ändere ich ja meine Meinung noch :)

                                Ich würde die Zuweisung nicht so realisieren.

                                Der Ausdruck hinter if enthält normalerweise immer irgendwelche Vergleiche. Wenn das jetzt gemischt werden kann mit Zuweisungen, dann eröffnet das eine typische Fehlerquelle: Statt eines gewollten Vergleichs schreibt man aus Versehen auch nur eine Zuweisung, weil man ein Gleichheitszeichen vergisst, und wundert sich dann über die daraus entstehenden Fehler.

                                Dieser Fehler ist so typisch und häufig, dass gute Entwicklungsumgebungen die Verwendung von Zuweisungen in Bedingungen als mögliche Fehlerquelle im Code markieren.

                                Und weil es besser ist, wenn der eigene Code keine Warnungen und Fehlermarkierungen enthält, hat man zwei Alternativen: Den Code so gestalten, dass er diese Zuweisung nicht im IF enthält, oder die Warnung abschalten, die einen davor bewahren würde, an anderen Stellen nicht aus Versehen den Vergleich falsch zu schreiben.

                                - Sven Rautenberg

                                1. Hallo,

                                  if ($data = GetStudioArray(...)) {...} das verstehe ich schon, aber finde es nicht so toll, aber evtl. Ändere ich ja meine Meinung noch :)
                                  Ich würde die Zuweisung nicht so realisieren.

                                  ich schon, aber ich würde es nicht unbedingt jemand anderem empfehlen.

                                  Der Ausdruck hinter if enthält normalerweise immer irgendwelche Vergleiche.

                                  Sagen wir: Logische (boolsche) Ausdrücke. Das kann ein Vergleich sein, aber auch jeder andere Ausdruck, der true oder false ergibt; sehr angenehm sind hier auch Funktionen mit gut gewählten Namen, die ein boolsches Ergebnis liefern, z.B. "if (isValidNumber(n))", das kann man nämlich fast wie Klartext lesen und verstehen.
                                  In einigen Sprachen (C, Javascript, PHP) geht sogar jeder Ausdruck, der irgendwas liefert, was als true oder false interpretiert werden könnte (etwa ein Zahlenwert !=0 für true, oder ==0 für false; ein gültiger Pointer !=NULL für true, ein NULL-Pointer für false).

                                  Wenn das jetzt gemischt werden kann mit Zuweisungen, dann eröffnet das eine typische Fehlerquelle: Statt eines gewollten Vergleichs schreibt man aus Versehen auch nur eine Zuweisung, weil man ein Gleichheitszeichen vergisst, und wundert sich dann über die daraus entstehenden Fehler.

                                  Das ist eine Frage der Erfahrung und Gewohnheit. Wenn man in der Klammer des if-Statements oft genug etwas notiert, was kein Vergleich ist, fällt mit der Zeit auch die Selbstverständlichkeit weg, mit der man annimmt, es müsse ein Vergleich sein, so dass man automatisch genauer hinsieht.

                                  Dieser Fehler ist so typisch und häufig, dass gute Entwicklungsumgebungen die Verwendung von Zuweisungen in Bedingungen als mögliche Fehlerquelle im Code markieren.

                                  Stimmt, habe ich häufig.

                                  Und weil es besser ist, wenn der eigene Code keine Warnungen und Fehlermarkierungen enthält, hat man zwei Alternativen: Den Code so gestalten, dass er diese Zuweisung nicht im IF enthält, oder die Warnung abschalten, die einen davor bewahren würde, an anderen Stellen nicht aus Versehen den Vergleich falsch zu schreiben.

                                  Ich wähle dann in aller Regel die zweite Alternative.

                                  Aber, wie oben schon erwähnt: Auch wenn ich solche Ausdrücke gern und oft verwende, würde ich sie einem Neuling nicht empfehlen. Ein alter Hase kommt irgendwann von selbst darauf, dass das in bestimmten Situationen praktisch sein kann.

                                  Ciao,
                                   Martin

                                  --
                                  Ordnung ist, wenn man etwas findet, was man gar nicht sucht.
                                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                      2. Sry mein erster Post ist falsch:

                        $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen");

                        liefert angeblich ein array zurück

                        dann musst du so prüfen.

                        $data = Array();  
                        $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen");  
                          
                        if ( count($data) == 0 )  
                        {  
                           break;  
                        }
                        
                        1. Hi!

                          dann musst du so prüfen.
                          $data = Array();
                          $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen");

                          Die Zuweisung eines leeren Arrays ist (abgesehen vom falschen großen A) wirkungslos, da sie durch die zweite Zuweisung mit dem Funktionsergebnis wieder überschrieben wird. Es ist ja nicht so, dass die Zuweisung eines leeren Arrays unbedingt ausgeführt wird und die zweite nur bedingt. Nein, beide finden unbedingt statt.

                          if ( count($data) == 0 )

                          Das bringt ganz gut die Intention rüber. Allerdings müsste die Funktion so umgeschrieben werden, dass sie immer ein Array - mal gefüllt, mal leer - zurückgibt. Alternativ kann man auch das Array direkt im booleschen Kontext befragen, denn ein leeres Array ergibt false und ein gefülltes true.

                          if (!$data)

                          Diese Auswertung kann man auch dann nehmen, wenn ein gefülltes Array oder false die beiden möglichen Funktionsergebnisse wären.

                          Lo!

    2. Hi!

      include("interface.home.studio/homeputer.studio.interface.php"); //Interface einbinden

      include und auch return sind keine Funktionen. Es müssen keine Klammern notiert. Im Falle von return gibt es sogar spezielle Situationen (beim Hantieren mit Referenzen) in denen durch die Klammern das Ergebnis negativ beeinflusst wird. Mein Tipp: lass die Klammern weg, sie bringen keine Punkte, nur manchmal Ärger.

      $count = 1; //Counter Startwert festlegen
          while($count < 5) //Schleife 5mal durchlaufen
          {
          [...]
          $count++; //Zähler um 1 erhöhen
          }

      Es steht doch im Grunde genommen genau fest, wie oft die Schleife durchlaufen werden soll. Wenn du eine for-Schleife nimmst, kannst du alle drei Schritte - Initialisierung, Abbruchbedingung, Inkrementierung - an einer Stelle notieren: im Kopf der for-Schleife.

      for ($count = 1; $count < 5; $count++) {
          ...
        }

      Und das break zum Abbrechen funktioniert bei for genauso wie bei while.

      Lo!

  2. Hi,

    $count = 1; //Counter Startwert festlegen

    while($count < 5) /Schleife 5mal durchlaufen
        {
        sleep(1); // 1 Sekunden warten
        $data = GetStudioArray("KS_300_Temp, KS_300_Feuchte, KS_300_Wind, KS_300_RegenAStunde, KS_300_Regen"); //Werte lesen
        if (isset($_COOKIE["data"])){ break; } //prüfen ob Daten von homestudio empfangen wurden, dann abbrechen
        $count++; //Zähler um 1 erhöhen
        }

      
    
    > Die Schleife soll 5mal durch laufen werden, wenn kein Rückgabewert von GetStudioArray kommt. Wird vorher ein Rückgabewert geliefert, so soll die Schleife beendet werden.  
      
    Ich sehe dich nirgendwo auswerten, ob GetStudioArray „einen Rückgabewert geliefert“ hat.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
  3. $count = 1; //Counter Startwert festlegen
        while($count < 5) //Schleife 5mal durchlaufen
        {
        ...
        }
    Die Schleife soll 5mal durch laufen werden...

    Kurze Anmerkung, die Schleife wird unter der Bedingung nur 4x durchlaufen :)