Continue wird nicht richtig verwendet!
YANG
- php
0 Blubb0 YANG0 tami0 YANG0 tami0 Vinzenz Mai1 Vinzenz Mai0 YANG
0 Kai3450 Vinzenz Mai
0 Vinzenz Mai0 Matti Mäkitalo
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?
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
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?
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
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?
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
- es funktioniert
Nope, es funktioniert NICHT mit meinem gepostetem Schleifen-Code, sonst würde ich mich hier ja nicht melden!
- nimm doch bitte kein "echo" um html auszugeben sondern platziere dein php im html mit alternativer syntax.
Begründung? Was würde das ändern?
hi,
- 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
Tach!
- 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.
- 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.
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
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
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
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. ;)
[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
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
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
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