Welcome back,
heute widmen wir uns dem Thema Schleifen, mit denen wir gewünschten Code und Aktionen wiederholt ausführen können. Es gibt mehrere Arten von Schleifen, ich zeige dir die 3 wichtigsten: for, foreach und while. Los geht’s!
Was sind Schleifen?
Mit Schleifen können wir bestimmte Codestücke mehrfach ausführen. Dabei kann vorher bekannt sein, wieviele Male die Schleife durchlaufen wird, es gibt aber auch Fälle, in denen das vorher nicht bekannt ist. Außerdem sind Schleifen eine fantastische Sache um über Arrays oder Objekte zu iterieren.
Iteration
Eine sog. Iteration bezeichnet einfach eine mehrfache Wiederholung oder Ausführung bestimmter Prozesse oder Aktionen.
Fangen wir an mit der …
for-Schleife
Die for-Schleife ist perfekt wenn wir im vornherein wissen, wie oft sie durchlaufen werden soll. Dem for
Schlüsselwort folgen in Klammern dann 3 Anweisungen:
- Code der vor dem Ausführen der Schleife ausgeführt wird. Im Regelfall wird hier eine numerische Variable deklariert und ein Wert zugewiesen – das ist die sog. Zählervariable.
- An zweiter Stelle wird ein Ausdruck ausgewertet – immer wenn dieser WAHR ergibt, wird das Ausführen der Schleife forgesetzt, andernfalls wird die Ausführung beendet und die Schleife verlassen.
- Am Ende wird noch eine Anweisung ausgeführt – standardmäßig zählt man hier eine Zählervariable hoch (oder runter, je nachdem).
Getrennt werden die Anweisungen mit dem ; Semikolon. Innerhalb der Schleife (umschlossen von geschweiften Klammern wie auch bei if) kann beliebiger Code stehen.
Lassen wir Code sprechen:
1 2 3 4 5 6 7 |
<?php for ($zaehler = 0; $zaehler < 5; $zaehler++) { echo $zaehler . "<br>"; } ?> |
Und das ist schon die ganze Magie. Wir deklarieren $zaehler
mit dem Wert 0. In der zweiten Anweisung legen wir die Bedingung fest die WAHR ergeben muss, damit die Schleife weiterläuft. Wie du siehst ist die Bedingung dass die Schleife weiterlaufen soll solange $zaehler
noch kleiner ist als 5. Im dritten Schritt legen wir den Code fest, der nach jedem Schleifendurchlauf ausgeführt wird – in dem Fall inkrementieren wir die $zaehler
Variable (also $zaehler
immer plus 1).
Das bedeutet wir starten mit $zaehler = 0, die Bedingung prüft, ob $zaehler kleiner als 5 ist (ja, 0 ist natürlich kleiner als 5) und anschließend addieren wir 1 zu $zaehler. Im zweiten Durchlauf hat $zaehler dementsprechend den Wert 1, das ganze Spiel geht so lange weiter, bis $zaehler irgendwann eben nicht mehr kleiner als 5 ist. Anschließend wird die Schleife verlassen und der Code danach wird ausgeführt.
Daher siehst du auch die folgende Ausgabe:
1 2 3 4 5 |
0 1 2 3 4 |
Macht Sinn, weil wir bei 0 beginnen und der letzte Wert (nachdem wir in jedem Durchlauf 1 dazu zählen) der kleiner als 5 ist natürlich die Zahl 4 sein muss.
Gut zu wissen
Das Inkrementieren bezeichnet eine schrittweise Erhöhung einer Variable.
Im Gegenzug ist mit dem Dekrementieren die schrittweise Verminderung des Werts einer Variable gemeint.
Beispiel #2
Natürlich können wir die Zählervariable mit einem anderen Wert außer 0 beginnen lassen und nach jedem Durchlauf auch mit einem beliebigen Wert inkrementieren oder dekrementieren. Ebenso können wir auch die Bedingung ändern. In der Programmierung nimmt man für for-Schleifen normalerweise immer den Variablennamen $i – das hat sich einfach so eingebürgert, wie das klassische Hallo-Welt-Beispiel oder FooBar. Deswegen machen wir das auch so.
Geben wir doch einfach mal das 3er-Einmaleins aus:
1 2 3 4 5 6 7 |
<?php for ($i = 3; $i <= 30; $i += 3) { echo $i . "<br>"; } ?> |
Die Zählervariable hat zu Anfangs den Wert 3. Wir erhöhen die Zählervariable nach jedem Schleifendurchlauf um den Wert 3, bis sie kleiner oder gleich 30 ist.
Wir erhalten folgende Ausgabe:
1 2 3 4 5 6 7 8 9 10 |
3 6 9 12 15 18 21 24 27 30 |
Beispiel #3
Wie ich schon sagte können die Bedingungen und Anweisungen angepasst werden. Lass mich dir noch ein paar Code-Beispiele hierzu zeigen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php # Von 0 an immer 2 addieren solange $i kleiner oder gleich 10 ist for ($i = 0; $i <= 10; $i += 2) { echo $i . ", "; } echo "<br>"; # Natürlich geht auch Multiplikation for ($i = 1; $i <= 4096; $i *= 2) { echo $i . ", "; } echo "<br>"; # Subtrahieren geht auch for ($i = 10; $i > 0; $i--) { echo $i . ", "; } echo "<br>"; # Wir können natürlich auch innerhalb der Schleife die Zählervariable ändern for ($i = 0; $i < 50; $i++) { $i += 2; echo $i . ", "; } ?> |
Dabei wird das ausgegeben:
1 2 3 4 |
0, 2, 4, 6, 8, 10, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50, |
Stolperfallen
Du musst aufpassen, dass dir nicht ein logischer Fehler unterläuft und das Programm in einer Endlosschleife endet. Das kann passieren, wenn die Bedingung niemals erfüllt wird – die Konsequenz ist dass das Skript so lange läuft, bis die maximale Skript-Ausführungszeit (die in der php.ini angepasst werden kann) erreicht ist.
Dieser Code endet auf jeden Fall in einer Endlosschleife, da $i
immer kleiner als 10 ist, weil wir ständig 1 abziehen:
1 2 3 4 5 6 7 8 |
<?php # Von 0 an immer 2 addieren solange $i kleiner oder gleich 10 ist for ($i = 1; $i <= 10; $i -= 1) { /* ... */ } ?> |
Je nach Einstellung bekommst du eine Fehlermeldung (oder musst nachher in der Log-Datei nachschauen – dazu kommen wir in einem späteren Artikel) die so oder so ähnlich aussieht:
Fatal error: Maximum execution time of 30 seconds exceeded on line number 4
Bedeutet dass die maximale Skript-Ausführungszeit von 30 Sekunden überschritten wurde und daher das Skript abgebrochen ist – und wir sehen sogar in welcher Zeile des Codes der Fehler auftrat.
Beispiel #3
Noch ein paar letzte kurze Beispiele für die Verwendung der for-Schleife.
Schleife um Array-Einträge auszugeben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php # Das Array deklarieren $Mitarbeiter = [ "Max Mustermann", "Verkauf", 3900, ]; # Von 0 an immer 2 addieren solange $i kleiner oder gleich 10 ist for ($i = 0; $i < (count($Mitarbeiter)); $i++) { echo $Mitarbeiter[$i] . "<br>"; } ?> |
Ausgabe:
1 2 3 |
Max Mustermann Verkauf 3900 |
Ok das funktioniert, ist wirklich saumäßig ätzender Code – mit der foreach-Schleife können wir wesentlich effizienter arbeiten wenn es um Arrays geht, das schauen wir uns weiter unten an.
Noch ein Beispiel mit Strings:
1 2 3 4 5 6 7 8 9 10 11 |
<?php # String deklarieren $Text = "Hello world!"; # Wir durchlaufen von 0 bis Anzahl Zeichen des Textes for ($i = 0; $i < (strlen($Text)); $i++) { echo substr($Text, $i, 1) . "<br>"; } ?> |
Die Ausgabe:
1 2 3 4 5 6 7 8 9 10 11 12 |
H e l l o w o r l d ! |
Wir beginnen in der for-Schleife wieder bei 0 zu zählen, und das solange die Zählervariable kleiner ist als die Anzahl an Zeichen des Strings. Wieviele Zeichen ein String enthält, kannst du mit der Funktion strlen ermitteln. Du übergibst den String und erhältst als Rückgabewert die Länge der Zeichen.
while-Schleife
Die while-Schleife läuft solange wie eine Bedingung WAHR ist – eine Zählervariable gibt es dafür nicht. Nach dem while Schlüsselwort geben wir in Klammern die Bedingung an – im Anweisungsblock kommt dann in geschweiften Klammern der Code der in jedem Schleifendurchlauf ausgeführt werden soll.
Im nachfolgenden Code deklarieren wir eine Variable $zahl und geben ihr den Wert 0. Die while Schleife soll so lange laufen wie $zahl kleiner ist als 10.
1 2 3 4 5 6 7 8 9 10 |
<?php $zahl = 0; while ($zahl < 10) { $zahl += 1; echo $zahl . ", "; } ?> |
Die Ausgabe:
1 |
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, |
Bis hierhin kennen wir das eigentlich schon. Anders ist nur, dass wir die Zählervariable außerhalb des while-Konstrukts deklarieren und wir innerhalb der Schleife entscheiden, in welcher Art und Weise sich dessen Wert ändert.
Hier ist die Gefahr einer Endlosschleife sogar noch ein bisschen höher. Was passiert wenn wir vergessen den Wert von $zahl im Anweisungsblock zu ändern kannst du dir sicher vorstellen …
Man kann wenn man will auch hier eine Zählervariable verwenden. Wenn wir zum Beispiel wollen, dass ein Zähler von einer Zahl runterzählt solange bis sie Null ist, könnte man so schreiben:
1 2 3 4 5 6 7 |
<?php $i = 12; while($i--){ echo "Zähler ist {$i}<br>"; } |
Wir bekommen die Ausgabe:
1 2 3 4 5 6 7 8 9 10 11 12 |
Zähler ist 11 Zähler ist 10 Zähler ist 9 Zähler ist 8 Zähler ist 7 Zähler ist 6 Zähler ist 5 Zähler ist 4 Zähler ist 3 Zähler ist 2 Zähler ist 1 Zähler ist 0 |
foreach-Schleife
Mit der foreach-Schleife können wir „iterierbare“ Datentypen durchlaufen, zum Beispiel Arrays. Es ist äußerst wahrscheinlich dass dort wo du mit Arrays zu tun hast früher oder später eine foreach-Schleife ins Spiel kommt. Nach dem foreach
Schlüsselwort geben wir in Klammern die Variable an gefolgt von as und dann einer Variable die in jedem Schleifendurchlauf den aktuellen Wert repräsentiert.
Im folgenden deklarieren wir ein Array mit einigen Werten und geben diese in der Schleife aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $Mitarbeiter = [ 'name' => "Max Mustermann", 'abteilung' => "Verkauf", 'gehalt' => 3900, ]; foreach ($Mitarbeiter as $value) { echo $value . "<br>"; } ?> |
Wir kriegen diese Ausgabe:
1 2 3 |
Max Mustermann Verkauf 3900 |
Wir geben an welches Array durchlaufen werden soll ($Mitarbeiter
) und die Variable die in jedem Schleifendurchlauf den aktuellen Wert repräsentiert ($value
).
Schlüssel und Wert anzeigen
Wir können zusätzlich zum Wert auch jeweils den aktuellen Array-Index darstellen:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $Mitarbeiter = [ 'name' => "Max Mustermann", 'abteilung' => "Verkauf", 'gehalt' => 3900, ]; foreach ($Mitarbeiter as $key => $value) { echo "{$key}: {$value}<br>"; } |
Die Ausgabe:
1 2 3 |
name: Max Mustermann abteilung: Verkauf gehalt: 3900 |
In den meisten Fällen geben wir Schlüssel und Wert an.
foreach in verschachtelten Arrays
Meistens hat eine Firma ja mehr als einen Mitarbeiter. Dementsprechend erstellen wir also ein Array mit mehreren Personen und geben diese nacheinander aus (inkl. Jahres-Gehalt).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php $Mitarbeiter = [ [ 'name' => "Simon Seller", 'abteilung' => "Verkauf", 'gehalt' => 4200, ], [ 'name' => "Mark Eting", 'abteilung' => "Marketing", 'gehalt' => 4500, ], [ 'name' => "Norbert Nerdinger", 'abteilung' => "IT", 'gehalt' => 3900, ], ]; foreach ($Mitarbeiter as $key => $value) { echo "Mitarbeiter #" . $key . "<br>"; $Gehalt = floatval($value['gehalt']); echo $value['name'] . ", " . $value['abteilung'] . ", " . number_format($Gehalt, 2, ',', '.') . " €<br>"; $Jahresgehalt = $Gehalt * 12; echo "Jahresgehalt: " . number_format($Jahresgehalt, 2, ',', '.') . " €<br>"; echo "<br>"; } ?> |
Die Ausgabe – sehr hübsch:
1 2 3 4 5 6 7 8 9 10 11 |
Mitarbeiter #0 Simon Seller, Verkauf, 4.200,00 € Jahresgehalt: 50.400,00 € Mitarbeiter #1 Mark Eting, Marketing, 4.500,00 € Jahresgehalt: 54.000,00 € Mitarbeiter #2 Norbert Nerdinger, IT, 3.900,00 € Jahresgehalt: 46.800,00 € |
Dadurch dass wir in diesem Fall ein mehrdimensionales Array haben, hat $value in jedem Schleifendurchlauf ein Unter-Array als Wert. Würden wir Zugriff auf die Daten eines Mitarbeiters (nehmen wir spontan mal den ersten) haben wollen, müssten wir entsprechend so schreiben:
1 |
echo $Mitarbeiter[0]['name']; |
Eine schön formatierte Ausgabe mit print_r macht es noch besser deutlich:
1 |
echo "<pre>" . print_r($Mitarbeiter, 1) . "</pre>"; |
gibt uns das hier aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Array ( [0] => Array ( [name] => Simon Seller [abteilung] => Verkauf [gehalt] => 4200 ) [1] => Array ( [name] => Mark Eting [abteilung] => Marketing [gehalt] => 4500 ) [2] => Array ( [name] => Norbert Nerdinger [abteilung] => IT [gehalt] => 3900 ) ) |
Die Werte des Haupt-Arrays sind also numerisch indiziert, die Werte der Unter-Arrays hingegen assoziativ (mit Namen, also ’name‘, ‚abteilung‘ und ‚gehalt‘).
foreach-Schleife in einem Formular
Legen wir nochmal ein Mitarbeiter Array an und machen die festgelegten Daten dann quasi-editierbar in einem Formular. Für die Abteilungen gibt es ein separates Array, die jeweilige Abteilung referenzieren wir in dem Mitarbeiter-Array dann über den Index. Schauen wir mal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
<?php # Die beiden Zeilen hier zum Aktivieren der Fehlerausgabe # wie ich dir ja bereits gezeigt hab ini_set('display_errors', 1); error_reporting(E_ALL); $Abteilungen = [ 0 => "Verkauf", 1 => "Marketing", 2 => "IT", 3 => "Sekretariat", 4 => "Presse", ]; $AlleMitarbeiter = [ [ 'name' => "Simon Seller", 'abteilung' => 0, 'gehalt' => 4200, ], [ 'name' => "Mark Eting", 'abteilung' => 1, 'gehalt' => 4500, ], [ 'name' => "Norbert Nerdinger", 'abteilung' => 2, 'gehalt' => 3900, ], [ 'name' => "Tanja Tippse", 'abteilung' => 3, 'gehalt' => 2600, ], [ 'name' => "Pierre P. R.", 'abteilung' => 4, 'gehalt' => 3400, ], ]; ?> <!DOCTYPE html> <html lang='de'> <head> <meta charset='utf-8'> <title>PHP lernen</title> <style type='text/css'> * { font-family : "verdana"; } input, button, select option { padding : 8px; } pre { font-family : "courier new"; } </style> </head> <body> <h1>Mitarbeiter verwalten</h1> <form method='POST'> <?php # Alle Mitarbeiter in einer Schleife durchlaufen foreach ($AlleMitarbeiter as $mKey => $Mitarbeiter) { echo "<strong>Mitarbeiter #" . $mKey . " bearbeiten</strong><br>"; # Eingabefeld für den Namen echo "Name<br><input type='text' name='name[]' value='" . $Mitarbeiter['name'] . "'><br><br>"; # Eingabefeld für das Gehalt $Gehalt = floatval($Mitarbeiter['gehalt']); echo "Gehalt<br><input type='text' name='gehalt[]' value='" . floatval($Mitarbeiter['gehalt']) . "'><br><br>"; # Dropdown für die Abteilung echo "Abteilung<br>"; echo "<select name='abteilung[]'>"; # Abteilungen in Schleife durchlaufen foreach ($Abteilungen as $aKey => $Abteilung) { echo "<option value='" . $aKey . "'"; if ($aKey == $Mitarbeiter['abteilung']) { echo " selected"; } echo ">" . $Abteilung . "</option>"; } echo "</select>"; echo "<br><hr><br>"; } ?> <p> <button type='submit' name='submit'>Absenden</button> </p> </form> <?php /** * Hier ist der PHP-Teil, der NACH dem Absenden * des Formulars ausgeführt wird. */ echo "<br><hr><br>"; # Checken ob das Formular abgesendet wurde if (isset($_POST['submit'])) { echo "Daten wurden erfolgreich aktualisiert.<br>"; // Wir tun mal so als ob echo "Ihre Eingaben:<br>"; echo "<pre>" . print_r($_POST, 1) . "</pre>"; } ?> </body> </html> |
Nicht erschrecken, ist ein bisschen viel. Gehen wir Stück für Stück durch was dort alles passiert:
- Wir aktivieren die Fehlerausgabe – passt.
- Wir deklarieren ein Array für die Abteilungen (theoretisch können wir uns die Angabe der Indexes sparen, weil PHP die Werte von Haus aus so nummerieren würde – aber so ist es gleich ersichtlich).
- Danach deklarieren wir das Mitarbeiter-Array mit allen Mitarbeitern. Bei der Abteilung geben wir anstatt den Wert (z.B. „Verkauf“) nur den Index des eigentlichen Wertes aus dem Abteilungen-Array an (ich sag dir dann gleich was das soll).
- Anschließend kommt der ganze HTML-Kram um die Seite aufzubauen. Darunter auch unser Formular.
- Dort durchlaufen wir dann alle Mitarbeiter und legen Eingabefelder fest, um die Daten zu bearbeiten.
- Bei dem Dropdown für die Abteilungen durchlaufen wir alle Werte des $Abteilungen Arrays.
Wichtig: du siehst dass wir hier eine Schleife in einer anderen Schleife haben (eine sog. verschachtelte Schleife), deswegen müssen wir hier unbedingt drauf achten, für die Schlüssel- und Werte-Repräsentation andere Variablennamen zu verwenden als die, die wir in der ersten (äußeren) Schleife schon haben. Wenn wir in der inneren Schleife erneut die Variablennamen „$mKey“ und „$Mitarbeiter“ verwenden, überschreiben wir die ja – das wollen wir auf keinen Fall. - Wir checken in Zeile 92 ob der Index des aktuellen Schleifendurchlaufs (für $Abteilungen) gleich ist mit dem Wert „abteilung“ des aktuellen Mitarbeiters. Falls ja geben wir “ selected“ aus, das heißt der option-Tag ist der aktiv selektierte Eintrag im DropDown.
- Danach noch der Submit Button und am Ende lediglich noch eine Ausgabe der übermittelten Formulardaten.
Vielleicht ist dir aufgefallen, dass wir in den Eingabefeldern (und Dropdowns) beim name-Attribut zwei eckige Klammern angegeben haben (Zeilen 80, 84 und 88). Das ist die Schreibweise, wenn wir unter demselben Namen mehrere Felder absenden möchten. Wie print_r nach Absenden des Formulars gut veranschaulicht, funktioniert das auch soweit.
Warum die Sache mit den getrennten Abteilungen?
Das ist eigentlich eine gute Frage. Theoretisch hätten wir für jeden Mitarbeiter beim Index „abteilung“ auch gleich die Abteilung reinschreiben können – haben wir ja im vorletzten Beispiel auch gemacht und es hat funktioniert. Was soll also der umständliche Mumpitz?
Nun, das hat schon einen Grund, und zwar simulieren diese beiden Arrays eine ganz stark vereinfachte „Datenbankstruktur“. Das heißt die Daten im Array sind für das Programm unsere „Datenquelle“. Und bei Datenbanken ist es üblich (und Best practice), Redundanzen zu vermeiden und Daten die öfter vorkommen zu konsolidieren und in eine separate Tabelle zu überführen, um später nur noch über deren ID in einer anderen Tabelle auf die Werte zu referenzieren. Theoretisch würden wir nach dem Absenden des Formulars die Benutzereingaben in einer Datenbank persistent speichern – auf unser Beispiel angepasst würde das bedeuten, dass die Änderungen dann fix in den Arrays gespeichert werden müssten (was natürlich nicht geht).
Wie auch immer du musst das jetzt noch nicht wissen, trotzdem möchte ich dich kurz an diesem Thema schnuppern lassen.
Beispiel für verschachtelte Schleifen
Wie eben schon gezeigt können wir Schleifen in Schleifen haben (beliebig viele). Nehmen wir zum Beispiel das Einmaleins für die Zahlen von 1 bis 10:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<style> * { font-family : "courier new"; } </style> <?php for ($i = 1; $i <= 10; $i++) { for ($j = $i; $j <= ($i * 10); $j += $i) { echo $j . ", "; } echo "<br>"; } ?> |
Wir erhalten folgende Ausgabe:
1 2 3 4 5 6 7 8 9 10 |
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, |
Überspringen und Abbrechen (continue und break)
Fast sind wir für heute fertig. Es gibt nur noch eine letzte Sache die ich dir unbedingt zeigen muss, und ich hab mir das aus gutem Grund für den Schluss aufgehoben, weil es ein Thema ist, das alle Arten von Schleifen betrifft. Die Rede ist von den Schlüsselwörtern continue
und break
. Trotzdem sind das zwei sinnvolle Dinge:
continue Anweisung
Das continue-Schlüsselwort können wir an jedem Platz innerhalb der Schleife verwenden. Diese Anweisung führt dazu, dass der aktuelle Schleifendurchlauf an dieser Stelle verlassen wird und mit dem nächsten Durchlauf forgefahren werden soll.
Nehmen wir ein Array mit Vornamen und durchlaufen das in einer Schleife. Dort legen wir fest dass wenn der Name mehr als 5 Buchstaben lang ist, dieser Name einfach übersprungen werden soll. Das heißt wir geben nur Vornamen aus, die 5 oder weniger Buchstaben haben. Und das sieht so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php $Namen = [ "Bob", "Thomas", "Linda", "Stefan", "Konrad", "Justing", "Anna", "Katharina", "Toni", "Richard", "Kim", ]; foreach ($Namen as $Name) { if (strlen($Name) > 5) { continue; } echo $Name . "<br>"; } ?> |
Dementsprechend erhalten wir die Ausgabe mit den aussortierten Namen:
1 2 3 4 5 |
Bob Linda Anna Toni Kim |
continue sagt der Schleife also einfach nur, dass an der Stelle der Durchlauf abgebrochen wird und der nächste anfangen soll.
break Anweisung
Das break-Schlüsselwort können wir ebenfalls an jedem Platz innerhalb der Schleife verwenden. Diese Anweisung führt dazu, dass die Schleife augenblicklich verlassen wird, wir springen also komplett raus und die Schleife ist beendet.
Verwenden wir als Beispiel fast den gleichen Code wie eben, nur mit break statt continue. Und ich habe nach der Array Deklaration noch ein shuffle hinzugefügt, somit sind die Werte im Array bei jedem Seitenaufruf zufällig angeordnet (shuffle ordnet alle Werte im Array einfach zufällig an). Abermals gehen wir alle Namen in der Schleife durch, diesmal mit dem Unterschied dass wir die Schleife mit break sofort verlassen sobald der Name mehr als 5 Buchstaben gefunden hat.
Mach dir keine Sorgen beim Testen, es kann vorkommen dass du bloß eine leere weiße Seite im Browser angezeigt bekommst. Das liegt dann einfach nur daran dass zufällig grad ein Name mit mehr als 5 Buchstaben der erste in der Liste ist – Seite neuladen und gut ist.
Also dann:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php $Namen = [ "Bob", "Thomas", "Linda", "Stefan", "Konrad", "Justing", "Anna", "Katharina", "Toni", "Richard", "Kim", ]; shuffle($Namen); foreach ($Namen as $Name) { if (strlen($Name) > 5) { break; } echo $Name . "<br>"; } ?> |
Ich hatte jetzt z.B. die Ausgabe
1 2 |
Kim Anna |
Bei dir kommt wahrscheinlich was anderes dabei raus.
Fazit
Bei der Programmierung wirst du um Schleifen nicht rum kommen, schon gar nicht wenn du später mit Datenbanken arbeitest. Der Einsatz von Schleifen ist vielfältig und je nach Anforderung kannst du entscheiden, welche Schleife gerade die optimale Lösung ist.
Im nächsten Artikel zeige ich dir, wie du Zufallszahlen generieren kannst, haben wir zwar in vorherigen Beispielen schon flüchtig genutzt, aber noch nicht so richtig damit experimentiert.
Gruß
Link
Zuerst ein Mal meine Hochachtung, dass sich jemand die Arbeit gemacht hat, hier die Grundlagen vn PHP-Schleifen zu erklären. Doch ich beschäftige mich schon seit Jahren (Jahrzehnten 😉 ) mit PHP und anderen Programmiersprachen und habe ein paar Hinweise zu dem Beispielen.
Zum einen stoßen mir die teilweise gewählten Variablennamen mit einem Großbuchstaben beginnend ganz böse auf ($Mitarbeiter, $Text, $Gehalt …). Es gibt eine allgemein geltende Konvention, dass Namen von Variablen immer mit einem Kleinbuchstaben beginnen. Die Schreibweise Großbuchstabe-weiter-mit-Kleinschreibung ist Klassen vorbehalten. Wenn aber Code-Beispiele veröffentlicht werden, die hauptsächlch an Anfänger_innen gerichtet sind, sehen diese Anfänger_innen zwar lauffähigen, aber nicht den „Regeln“ entsprechenden Code und machen diesen Murks eventuell nach. Die Einhaltung dieser „Regeln“ ist jedoch extrem sinnvoll, wobei eine Erläuterung des Warums Seiten füllen würde, was ich an dieser Stelle natürlich nicht machen kann.
Der zweite Punkt ist eine Optimierung der hier vorgestellten Beispiele. Für kurze, wenig verwendete Programme ist es zwar belanglos, wenn der Code nicht so optimal wie möglich konzipiert ist. Denn die nachfolgend von mir vorgeschlagenen Verbesserungen gewinnen nur Nanosekunden an Laufzeit; vielleicht sogar noch weniger. Aber bei einem Programm mit langer Laufzeit (oder häufiger Verwendung) summieren sich diese Nanosekunden zu möglicherweise Zehntel-Sekunden oder Sekunden. Und jede Zeiteinheit an Laufzeit belastet das System sowie verzögern das Ergebnis um genau die Länge dieser Zeiteinheit (in Extremfällen um einige Sekunden).
Eine Abfrage auf „X = Y“ (u. a. in den for-Schleifen) verbraucht mehr Zeit als eine entsprechenden Abfragen „X Y“. Wenn zu dem Y der Wert der 3. Anweisung innerhalb des for (i.d.R die Inkrementierung/Dekrementierung) bei ‚=‘ subtrahiert wird, wird eine (schnellere) Abfrage mit „X Y“ erreicht. Im Beispiel 2 sähe es dann so aus:
statt „for ($i = 3; $i <= 30; $i += 3)"
besser "for ($i = 3; $i < 33; $i += 3)"
In den Schleifenkonstrukten wird teilweise die Ermittlung des Wahrheitswerts für einen weiteren Durchlauf mittels einer Funktion ermittelt. Ein Vergleich "Variable1 < funktion()" oder "Variable1 < (3 + 4)" verbraucht aber erheblich mehr Zeit als ein einfacher Vergleich "Variable1 < Variable2" ('<' ist nur beispielhaft und kann durch jeglichen Vergleichsoperator ersetzt werden.) Deshalb ist es besser, diesen Funktionaufruf (oder eine mathematische Berechnung) nur ein Mal (am Schleifenanfang) durchzuführen und den Wert in einer (Zwischen-)Variablen zu speichern. Dann kann die mehrfach durchgeführte Ermittlung der Wahrheitswert für einen weiteren Durchlauf mittels einem Vergleich von zwei simplen Variablen durchgeführt werden:
statt "for ($i = 0; $i < (count($mitarbeiter)); $i++)"
besser "for ($i = 0, $endI = count($mitarbeiter); $i < $endI, $i++)"
So wird die Funktion count($mitarbeiter) nur ein Mal angewandt und der eigentliche Vergleich erfolgt zwischen zwei simplen Variablen.
Bei einem wirklich optimalen Programmcode werden Funktionsaufrufe und mathematische Berechnungen so wenig wie emöglich durchgeführt. Anders als ein Mensch merkt sich ein Computer (Programm) ja nichts automatisch und muss das Ergebnis jedes Mal neu Ausrechnen, wenn er wieder danach "gefragt" wird und es nicht explizit (in einer Variablen) zwischengespeichert wurde.
Hi Kira, danke für deinen Kommentar 🙂
Auf Coding Style Guides nach PSR-1 / PSR-12 hab ich hier bewusst verzichtet, zum Lernen der Sprache ist das absolut noch nicht relevant. Später mal ja, aber noch nicht auf diesem Level an PHP Kenntnissen. Ich benutze auch deutsche Namen und achte nicht auf jede Nanosekunde die ich an Performance einsparen kann, ganz einfach weil es in diesem Beitrag darum auch überhaupt (noch) nicht geht 😉
Ich kann natürlich nachfühlen was du meinst, ich programmiere seit ~17 Jahren mit PHP und muss mich ja auch dazu zwingen, einige Details wegzulassen um die Verständlichkeit und Lesbarkeit des Beitrags für Einsteiger in ein adäquates Verhältnis zu pendeln. Und an dem Punkt verzichte ich gerne auf tiefergehende Hintergrundinformationen und Randnotizen und komme darauf lieber in einem späteren Beitrag zurück, nämlich wenn sich der Zusammenhang für den Leser mit dem bis dahin aufgebauten Wissen besser erschließt 🙂
Grüße
Marius