Marco: switch und continue

Hallo zusammen,
ich habe folgenden Quellcode, welcher merkwürdigerweise zu keiner Ausgabe führt:
<?php
$var = 2;
switch(true)
{
 case ($var == 1):
  echo '1';
 break;
 case ($var == 2):
  $var = 5; continue;
 case ($var == 3):
 break;
 case ($var == 4):
  echo '4';
 break;
 default:
  echo 'default';
 break;
}
?>

Auch wenn man beim 2. Fall das $var = 5; in $var = 1 oder 4 umändert, gibt es keine Ausgabe. Ich habe wirklich keine Ahnung woran das liegt.
Mit switch ($var) und dann bei den Fällen nur die Zahl habe ich es auch schon getestet, geht aber genauso wenig.

Kann das an meiner PHP-Version(5.0.2) liegen?

Vielen Dank im Vorraus
Marco

  1. Ich habe eben auch nocheinmal an das Ende des Skripts die Variable $var mit echo ausgeben lassen und sie hat den Wert 5, bloß die "default"-Anweisung wird nie ausgeführt.

    Ich habe das ganze eben auch nocheinmal auf einem anderen Server mit PHP 4.3.2 getestet, geht dort aber auch nicht.

    Marco

    1. Hallo,

      Du solltest Dir vielleicht nochmal die genaue Def. der Funktion 'switch' durchlesen.

      Hier würde ich dir eher zu 'ner Reihe von if-Anweisungen raten.

      mfg dolito

      1. Und wie kann man dann bei if-Anweisungen wieder hochspringen? Das war ja gerade das, was ich wollte. Ich bin schon bei case 2:, aber da stellt das Skript fest, dass es 1 doch noch ausführen muss. Deshalb wollte ich einfach die Variable ändern und dann durch continue nochmal von oben aus alles prüfen lassen, aber es geht irgendwie überhaupt nicht.

        Ich habe jetzt das Problem jetzt eh anders gelöst, mich würde aber trotzdem interessieren, warum continue hier nicht ordnungsgemäß funktioniert.

        Marco

        1. Und wie kann man dann bei if-Anweisungen wieder hochspringen? Das war ja gerade das, was ich wollte. Ich bin schon bei case 2:, aber da stellt das Skript fest, dass es 1 doch noch ausführen muss. Deshalb wollte ich einfach die Variable ändern und dann durch continue nochmal von oben aus alles prüfen lassen, aber es geht irgendwie überhaupt nicht.

          <?php
          if ($var==1)
          $step = 1;
          elseif ($var==2)
          $step = 2;
          elseif ($var==3 || $var==4)
          $step = 3;
          else $step = 2;

          if ($step == 1)
          {
          ...
          }
          elseif ($step == 2)
          {
          ...
          }
          usw.

          Ich habe jetzt das Problem jetzt eh anders gelöst, mich würde aber trotzdem interessieren, warum continue hier nicht ordnungsgemäß funktioniert.

          Bedenke 'switch' ist keine Schleife!!! sondern eine 'Entscheidungshilfe'(ich 'nen es mal so )

          Die bedingungen werden nach und nach abgeklappert, wenn eine zutrifft, wird der gesamte code darunter ausgeführt.
          Abbrechen kann man das mit break.
          Und aus, mehr gibt's nicht.

          Bitte berichtigen, falls auf dem Holzweg.

          Wie hast Du es denn gelöst?

          mfg dolito

          1. Hi,

            Die bedingungen werden nach und nach abgeklappert, wenn eine zutrifft, wird der gesamte code darunter ausgeführt.
            Abbrechen kann man das mit break.
            Und aus, mehr gibt's nicht.

            In PHP schon, wie ich vorhin beim nachgucken im Manual gesehen hab - ich dachte auch, daß continue im switch nichts zu suchen hat.
            Aber PHP sieht das anders.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          2. Bedenke 'switch' ist keine Schleife!!! sondern eine 'Entscheidungshilfe'(ich 'nen es mal so )

            Die bedingungen werden nach und nach abgeklappert, wenn eine zutrifft, wird der gesamte code darunter ausgeführt.
            Abbrechen kann man das mit break.
            Und aus, mehr gibt's nicht.

            In der PHP-Dokumentation steht bei switch folgendes:
            Anmerkung:  Beachten Sie bitte, dass im Unterschied zu anderen Programmiersprachen die continue  Anweisung auch bei switch ihre Gültigkeit hat und ähnlich wie break funktioniert. Falls Sie switch innerhalb einer Schleife verwenden und mit dem nächsten Durchlauf der äußeren Schleife beginnen möchten, verwenden Sie continue 2.

            Bitte berichtigen, falls auf dem Holzweg.

            Wie hast Du es denn gelöst?

            Ich habe jetzt eine Schleife um die switch-Anweisung gepackt. So kann ich immer die switch-Anweisung nochmal mit "continue 2;" die switch-Abfrage nochmal ablaufen lassen. Die Schleife ist eigentlich eine unendliche Schleife, wird jedoch durch ein break unter der switch-Anweisung beendet. Ich weiß, dass es nicht so schön ist, klappt aber bestens. Ich habe auch schon an eine rekursive Funktion gedacht, aber da müsste ich dann alle Variablen übergeben oder global machen und das ist zu viel Arbeit. Deshalb habe ich es jetzt so gelöst.

            Mich wundert aber wirklich, dass in der Dokumentation nicht steht, dass das continue nicht so richtig funktioniert oder dass es niemand anderes mal ausprobiert hat, es steht nämlich nichts in den Benutzerkommentaren.

            Marco

            mfg dolito

            1. In der PHP-Dokumentation steht bei switch folgendes:
              Anmerkung:  Beachten Sie bitte, dass im Unterschied zu anderen Programmiersprachen die continue  Anweisung auch bei switch ihre Gültigkeit hat und ähnlich wie break funktioniert. Falls Sie switch innerhalb einer Schleife verwenden und mit dem nächsten Durchlauf der äußeren Schleife beginnen möchten, verwenden Sie continue 2.

              Genau so hast Du es ja jetzt gemacht.

              Mich wundert aber wirklich, dass in der Dokumentation nicht steht, dass das continue nicht so richtig funktioniert oder dass es niemand anderes mal ausprobiert hat, es steht nämlich nichts in den Benutzerkommentaren.

              Dann schreib doch was dazu, wenn Du denkst es bringt andere weiter.
              Dafür sind sie doch da.

              mfg dolito

  2. Hallo,
    ich denke so kommt es zur gewünschten Ausgabe.
    <?php
    $var = 2;
    switch($var)
    {
     case ($var == 1):
      echo '1';
     break;
     case ($var == 2):
      $var = 5; continue;
     case ($var == 3):
     break;
     case ($var == 4):
      echo '4';
     break;
     default:
      echo 'default';
     break;
    }
    echo $var;
    ?>