if, elseif, else
<?php
$punkte = 78;
if ($punkte >= 90) {
echo "sehr gut\n";
} elseif ($punkte >= 75) {
echo "gut\n";
} else {
echo "weiter üben\n";
}
echo $punkte >= 50 ? "bestanden" : "durchgefallen", "\n";
// Alternative Syntax in Templates
if ($punkte > 70):
echo "über 70\n";
endif;gut bestanden über 70
switch und match
match (PHP 8) ist der moderne, strikte Ersatz für switch: Er liefert einen Wert, vergleicht mit ===, braucht kein break und wirft einen Fehler, wenn nichts passt.
<?php
$tag = 3;
switch ($tag) {
case 6:
case 7:
echo "Wochenende\n";
break;
default:
echo "Werktag\n";
}
$name = match ($tag) {
1 => "Montag",
2 => "Dienstag",
3, 4 => "Mitte der Woche",
default => "anderer Tag",
};
echo $name, "\n";
$note = 87;
echo match (true) {
$note >= 90 => "A",
$note >= 80 => "B",
default => "C",
}, "\n";
try {
echo match (99) { 1 => "eins" };
} catch (\UnhandledMatchError $e) {
echo get_class($e), ": ", $e->getMessage(), "\n";
}Werktag Mitte der Woche B UnhandledMatchError: Unhandled match case of type int
Schleifen
<?php
for ($i = 1; $i <= 3; $i++) echo $i, " ";
echo "\n";
$n = 3;
while ($n > 0) { echo $n--, " "; }
echo "\n";
$k = 10;
do { echo $k, " "; } while ($k < 5); // läuft mindestens einmal
echo "\n";
foreach ([10, 20, 30] as $index => $wert) echo "$index=$wert ";
echo "\n";
foreach (["a" => 1, "b" => 2] as $key => $value) echo "$key:$value ";
echo "\n";
foreach ([1, 2, 3, 4, 5, 6] as $z) {
if ($z % 2) continue; // überspringen
if ($z > 4) break; // abbrechen
echo $z, " ";
}
echo "\n";
for ($i = 0; $i < 3; $i++) {
for ($j = 0; $j < 3; $j++) {
if ($j == 2) continue 2; // äußere Schleife fortsetzen
echo "$i$j ";
}
}
echo "\n";1 2 3 3 2 1 10 0=10 1=20 2=30 a:1 b:2 2 4 00 01 10 11 20 21
foreach mit Referenz
Mit & änderst du die Elemente direkt. Hänge danach die Referenz mit unset ab:
<?php
$preise = [10, 20, 30];
foreach ($preise as &$p) { $p *= 2; }
unset($p);
print_r($preise);Array
(
[0] => 20
[1] => 40
[2] => 60
)Weitere Konstrukte
<?php
foreach (range(1, 10, 3) as $z) echo $z, " ";
echo "\n";
foreach (range('a', 'e') as $c) echo $c;
echo "\n";
[$a, [$b, $c]] = [1, [2, 3]];
['x' => $x, 'y' => $y] = ['x' => 10, 'y' => 20];
echo "$a$b$c $x $y\n";
foreach ([[1, 2], [3, 4]] as [$l, $r]) echo $l + $r, " ";
echo "\n";
goto ende;
echo "wird übersprungen\n";
ende:
echo "Ende\n";1 4 7 10 abcde 123 10 20 3 7 Ende
Merke
if / elseif / else, ternär,??matchist strikt, liefert einen Wert und wirftUnhandledMatchError- Schleifen:
for,while,do-while,foreach(am häufigsten) breakundcontinue(auch mit Ebenenangabe)foreach ($a as &$x)ändert Elemente, danachunset($x)
Aufgabe
Gib die Zahlen von 1 bis 30 aus; bei Vielfachen von 3 "Fizz", von 5 "Buzz", von beiden "FizzBuzz" (mit match).