YANG: Continue wird nicht richtig verwendet!

Servus - ich hab da mal ne Frage:

Ich habe vereinfacht eine derartige Struktur:

$k = false;
for($i=0;$i<10;$i++) {
   if($k == true) {
      continue;
   }
   else {
      echo "test";
   }
}

Jetzt wird bei mir ein einziges mal test ausgegeben und das wars. Normalerweise müsste ich doch hier 10mal "test" lesen? Die Schleife bricht bei mir nach continue einfach ab - was mache ich falsch?

  1. Hallo,

    Normalerweise müsste ich doch hier 10mal "test" lesen?

    Ja.

    Die Schleife bricht bei mir nach continue einfach ab - was mache ich falsch?

    Bricht sie wirklich ab? Ansonsten würde ich vermuten, dass du im If anstatt '$k' '$i' zu stehen hast.

    Grüße

    1. Bricht sie wirklich ab? Ansonsten würde ich vermuten, dass du im If anstatt '$k' '$i' zu stehen hast.

      Ja, die Schleife bricht wirklich ab, es werden auch keine Fehlermeldungen geloggt und NEIN, ich habe dort nicht $i statt $k stehen - wobei das nur eine Vereinfachung darstellt, die gesamte for Schleife ist 80 Zeilen lang...

      Genauer Beschrieben: Durch mein continue wird bei der for schleife direkt nach dem ersten durchlauf, weil die Bedingung nicht gegeben ist DIREKT abgebrochen - es kommt nur eine ausgabe anstatt 10!

      Woran kann sowas noch liegen? Soll ich die ganzen Zeilen mal posten?

      1. hi,

        Woran kann sowas noch liegen? Soll ich die ganzen Zeilen mal posten?

        nein, dein beispiel liefert bei mir:

        testtesttesttesttesttesttesttesttesttest

        was willst du mehr?

        mfg

        tami

        1. Was ich mehr möchte? Dass es funktioniert. Aber ich habe wohl viel zu stark vereinfacht. Hier jetzt die komplette for Schleife:

          for($i=0;$i<count($ServerCounter);$i++) {
                    // Get the account type of the server's owner
          $UserMatch = array_search($ServerList["Accounts"][$i],$UserList["Names"]);
          // TESTAUSGABE
          echo "$i --------<br>";
          if($UserList["Types"][$UserMatch] == true) {
          // If the server's owner's account ist a premium account, show it
                         echo '<table id="ServerField">';
          echo '<tr>';
               echo '<a name="' . $ServerList["IDs"][$i] . '"></a>';
          echo '<td id="Number">' . ($i+1) . '</td>';
          echo '<td>' . $ServerList["Names"][$i] . '</td>';
          echo '<td><a id="Button" href="' . $ServerList["IPs"][$i] . '" target="blank">' . $ServerList["IPs"][$i] . '</a></td>';
          echo '<td>' . $ServerList["Accounts"][$i] . '</td>';
          echo '<td> <a id="Button" href="index.php?s=vote&id=' . $ServerList["IDs"][$i] . '">' . $Translations[$Language]["LIST"][7] . '</a> ' . $ServerList["Votes"][$i] . '</td>';
          echo '<td>' . date("d.m.y",$ServerList["Dates"][$i]) . '</td>';
          echo '</tr>';
          echo '</table>';

          		echo '<table id="ServerDesc">';  
          			echo '<tr>';  
          				echo '<td colspan="0" nowrap>' . $ServerList["Descriptions"][$i];  
          				     // Shows graphic how many players are online  
          					echo '<span id="OnlinePlayers">';  
          						$Percentage = 100/($ServerList["MaxOnline"][$i] + $ServerList["CurrentlyOnline"][$i]);  
          						$MaxOnlinePercentage = round($Percentage \* $ServerList["MaxOnline"][$i]);  
          						$CurrentlyOnlinePercentage = round($Percentage \* $ServerList["CurrentlyOnline"][$i]);  
          
          						echo '<div id="Red" style="height:' . ($MaxOnlinePercentage\*2) . 'px;">' . $ServerList["MaxOnline"][$i] . '</div>';  
          						echo '<div id="Green" style="height:' . ($CurrentlyOnlinePercentage\*2) . 'px;">' . $ServerList["CurrentlyOnline"][$i] . '</div>';  
          					echo '</span>';  
          					// Shows if the server is online or not  
          					echo '<span id="OnlineStatus">';  
          					     if($ServerList["Online"][$i] == true) {  
          							// If the server is online  
          							echo '<div id="Green">Online</div>';  
          						}  
          						else {  
          							// If the server is not online  
          							echo '<div id="Red">Offline</div>';  
          						}  
          					echo '</span>';  
          					// Shows Vote Statistics  
          					echo '<span id="VoteStatistics">';  
          

          $Percentage = 100/($VoteCounter + $ServerList["Votes"][$i]);
          $MaxVotesPercentage = round($Percentage * $VoteCounter);
          $VotesPercentage = round($Percentage * $ServerList["Votes"][$i]);

          						echo '<div id="Red" style="height:' . ($MaxVotesPercentage\*2) . 'px;">' . $VoteCounter . '</div>';  
          						echo '<div id="Green" style="height:' . ($VotesPercentage\*2) . 'px;">' . $ServerList["Votes"][$i] . '</div>';  
          					echo '</span>';  
          					// Shows Country the server is from  
          					echo '<span id="Countries">';  
          						echo $ServerList["Countries"][$i];  
          					echo '</span>';  
          				echo '</td>';  
          			echo '</tr>';  
          		echo '</table>';  
          	}  
          	else {  
          		// If the server's owner's account is not premium, don't show it  
          		continue;  
          	}  
          }  
          

          Normalerweise müsste hier mehrfach "$i------------" ausgegeben werden, wird es aber nicht. Was mache ich falsch?

          1. hi,

            Was ich mehr möchte? Dass es funktioniert. Aber ich habe wohl viel zu stark vereinfacht. Hier jetzt die komplette for Schleife:

            1. es funktioniert
            2. nimm doch bitte kein "echo" um html auszugeben sondern platziere dein php im html mit alternativer syntax.

            mfg

            tami

              1. es funktioniert

              Nope, es funktioniert NICHT mit meinem gepostetem Schleifen-Code, sonst würde ich mich hier ja nicht melden!

              1. nimm doch bitte kein "echo" um html auszugeben sondern platziere dein php im html mit alternativer syntax.

              Begründung? Was würde das ändern?

              1. hi,

                1. nimm doch bitte kein "echo" um html auszugeben sondern platziere dein php im html mit alternativer syntax.

                Begründung? Was würde das ändern?

                Naja, erleichtert die Fehlersuche generell, weil der Code übersichtlicher ist, ermöglicht Syntaxhighlighting (was die Fehlersuche erleichtert). http://php.net/manual/de/control-structures.alternative-syntax.php

                mfg

                tami

              2. Tach!

                1. es funktioniert
                  Nope, es funktioniert NICHT mit meinem gepostetem Schleifen-Code, sonst würde ich mich hier ja nicht melden!

                Deine Beispiel-Schleife ist anders aufgebaut als deine wirkliche. Das continue steckt nicht im if-Zweig sondern als einzige Anweisung im else-Zweig, der sowieso der letzte vor dem Ende der for-Schleife ist. Mit anderen Worten: Der else-Zweig ist komplett überflüssig. Sowohl wenn er ausgeführt wird als auch wenn nicht, wird mit den nächsten Schleifendurchlauf fortgefahren.

                Wenn du nur einen Durchlauf bekommst, ist entweder die Anzahl in $ServerCounter anders als vorgestellt oder die erste Bedingung nur einmal erfüllt. Ansonsten sehe ich nichts, das die Ursache sein könnte.

                1. nimm doch bitte kein "echo" um html auszugeben sondern platziere dein php im html mit alternativer syntax.
                  Begründung? Was würde das ändern?

                Am Problem vermutlich nichts, aber an der Übersicht. Selbst Heredoc oder Nowdoc-Syntax ist besser als viele echos.

                Auch ist bei if (x == true) der Vergleich mit dem true überflüssig - ist es wahr, dass x wahr ist?

                dedlfix.

                1. Auch dir ein Dank für deine Hilfe, du und Vicenz haben den Fehler gefunden, den zu finden ich gestern einfach zu blöd war.

                  YANG

          2. Hallo,

            Was ich mehr möchte? Dass es funktioniert. Aber ich habe wohl viel zu stark vereinfacht. Hier jetzt die komplette for Schleife:

            vor allem falsch vereinfacht. Deine Ausgabe ist ja außerhalb der if-Anweisung:

            # Wie sieht der Inhalt von $ServerCounter aus?  
            # Nach Deiner Beschreibung müsste count($ServerCounter) zurückliefern :-)  
              
            # vgl. [link:http://de2.php.net/manual/de/function.count.php#refsect1-function.count-returnvalues@title=Handbuch zu count(), Abschnitt Rückgabewert]:  
            #     "Ist var kein Array oder Objekt mit Interface Countable, wird 1 zurückgegeben."  
              
            var_dump($ServerCounter);  
              
            
            > for($i=0;$i<count($ServerCounter);$i++) {  
            > 		$UserMatch = array_search($ServerList["Accounts"][$i],$UserList["Names"]);  
            > 		// TESTAUSGABE  
            > 		echo "$i --------<br>";  
            > 		if($UserList["Types"][$UserMatch] == true) {  
              
                                # Ausgaben und Anweisungen, die $i allesamt nicht ändern  
                                # gekürzt  
              
            
            > 		}  
            > 		else {  
            > 			// If the server's owner's account is not premium, don't show it  
            > 			continue;  
            > 		}  
            > 	}  
              
            # und auf den überflüssigen else-Zweig [pref:t=210233;m=1432490@title=hat dedlfix Dich schon hingewiesen]  
            
            

            d.h. die Vereinfachung erfolgt zu:

            $boundary = count($ServerCounter);    # einmal bestimmen reicht :-)  
            var_dump($boundary);                  # Kontrollausgabe  
            for ($i = 0; $i < $boundary; $i++) {  
                echo "$i -------<br>";             # noch eine innerhalb der Schleife  
                if(some_expression($i)) {  
                    # produziere Ausgabe  
                }  
                else {  
                    continue;  
                }  
            }  
            
            

            was man ohne Verlust zu

            $boundary = count($ServerCounter);    # einmal bestimmen reicht :-)  
            var_dump($boundary);                  # Kontrollausgabe  
            for ($i = 0; $i < $boundary; $i++) {  
                echo($i -------<br>";             # noch eine innerhalb der Schleife  
                if(some_expression($i)) {  
                    # produziere Ausgabe  
                }  
            }  
            
            

            vereinfachen kann. Wie dedlfix schon schreibt, gibt es gar kein Problem mit continue sondern eines mit count($ServerCounter).

            Freundliche Grüße

            Vinzenz

          3. Hallo,

            ich hab' eine Idee.

            Was ich mehr möchte? Dass es funktioniert. Aber ich habe wohl viel zu stark vereinfacht. Hier jetzt die komplette for Schleife:

            Kann es sein, dass dieser Code

            » for($i=0;$i<count($ServerCounter);$i++) {  
            
            >           // Get the account type of the server's owner  
            > 		$UserMatch = array_search($ServerList["Accounts"][$i],$UserList["Names"]);  
            
            

            [...]

            ursprünglich in etwa so

            for($i=0;$i<count($ServerList["Accounts"]);$i++) {  
                // Get the account type of the server's owner  
                $UserMatch = array_search($ServerList["Accounts"][$i],$UserList["Names"]);  
            
            

            aussah und Du das in

            $ServerCounter = count($ServerList["Accounts"]);  
            for($i=0;$i<count($ServerCounter);$i++) {  
                // Get the account type of the server's owner  
                $UserMatch = array_search($ServerList["Accounts"][$i],$UserList["Names"]);  
                # [...]  
            
            

            geändert hast und versehenlich noch den Aufruf von count() hast stehen lassen, statt

            $ServerCounter = count($ServerList["Accounts"]);  
            for($i=0; $i < $ServerCounter; $i++) {  
                // Get the account type of the server's owner  
                $UserMatch = array_search($ServerList["Accounts"][$i],$UserList["Names"]);  
                # [...]  
            
            

            zu schreiben? Das erklärte das einmalige Durchlaufen der Schleife und die mir unmotiviert erscheinende Kombination von

            $i<count($ServerCounter)

            mit

            $UserMatch = array_search($ServerList["Accounts"][$i],$UserList["Names"]);

            Freundliche Grüße

            Vinzenz

            1. Wow, genau das war es. Natürlich kann das dann nicht funktionieren. Ich hab mir zu Testausgaben immer nur echo $ServerCount ausgeben lassen und dann z.B. die "16" erhalten und mich gewundert warum der nicht 16 mal durchläuft. Das alte count() hatte ich natürlich komplett vergessen zu entfernen. Kann man mal sehen wie derartige Kleinigkeiten alles kaputt machen. Vielen Dank für die ambitionierte Hilfe! Und ja, du hattest recht - genauso wie von dir beschrieben war es. ;)

      2. [latex]Mae  govannen![/latex]

        Woran kann sowas noch liegen? Soll ich die ganzen Zeilen mal posten?

        Nein. setze in die Schleife ein var_dump($k); und beobachte, ob und wann der Wert wahr wird (bedenke, daß bei typungebundenem Vergleich mit == alles außer 0, '0', '', false, null als true angesehen wird

        Stur lächeln und winken, Männer!
        Kai

        --
        It all began when I went on a tour, hoping to find some furniture
         Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
        SelfHTML-Forum-Stylesheet
      3. Hallo,

        Genauer Beschrieben: Durch mein continue wird bei der for schleife direkt nach dem ersten durchlauf, weil die Bedingung nicht gegeben ist DIREKT abgebrochen - es kommt nur eine ausgabe anstatt 10!

        Woran kann sowas noch liegen? Soll ich die ganzen Zeilen mal posten?

        da Deine Vereinfachung den logischen Fehler eliminiert hat (siehe Matti, tami und ich): ja, bitte.

        Freundliche Grüße

        Vinzenz

  2. Hallo,

    Ich habe vereinfacht eine derartige Struktur:

    $k = false;
    for($i=0;$i<10;$i++) {
       if($k == true) {
          continue;
       }
       else {
          echo "test";
       }
    }

    Jetzt wird bei mir ein einziges mal test ausgegeben und das wars.

    Du hast zu stark verinfacht, bei Deinem Code hier *wird*

    testtesttesttesttesttesttesttesttesttest

    ausgegeben. Dein Fehler muss woanders liegen.

    Freundliche Grüße

    Vinzenz

  3. Hi,

    Ich habe vereinfacht eine derartige Struktur:

    $k = false;
    for($i=0;$i<10;$i++) {
       if($k == true) {
          continue;
       }
       else {
          echo "test";
       }
    }

    Jetzt wird bei mir ein einziges mal test ausgegeben und das wars. Normalerweise müsste ich doch hier 10mal "test" lesen? Die Schleife bricht bei mir nach continue einfach ab - was mache ich falsch?

    /cygdrive/d $> cat newfile.php
    <?php
    $k = false;
    for($i=0;$i<10;$i++) {
            if($k == true) {
                    continue;
            }
            else {
                    echo "test";
            }
    }
    /cygdrive/d $> php newfile.php
    testtesttesttesttesttesttesttesttesttest/cygdrive/d/ $>

    Macht also das, was du erwartest.

    Bis die Tage,
    Matti