Loops (lussen) zijn een handige manier om herhaalde taken uit te voeren. Stel je voor dat je een lijst met de 15 coupletten van het Wilhelmus hebt en je wilt voor elk couplet een bepaalde actie uitvoeren, zoals er een anker naar in een geordende lijst weergeven. In plaats van dezelfde code telkens opnieuw te schrijven voor ieder couplet, kun je een loop gebruiken om dit proces te automatiseren.
In PHP onderscheiden we drie verschillende soorten loops: loops waarbij niet per se vooraf bekend is hoevaak een taak herhaald moet worden, loops waarbij je dat wel vooraf weet en een speciale loop om door elk element van een zogenaamde array te gaan.
Binnen alle verschillende loops is het mogelijk om de loop voortijdig af te breken of om tussentijds naar de volgende herhaling te springen. Dit kan handig zijn om stukken code over te slaan op basis van bepaalde voorwaarden.
Met deze loop voer je een blok code uit zolang een bepaalde voorwaarde waar is. Bijvoorbeeld, als je een lijst met getallen wilt afdrukken zolang het getal kleiner of gelijk aan 10 is, kun je een while-loop gebruiken.
while ( voorwaarde ) {
...
}
Hierin zal de voorwaarde vaak een vergelijking tussen een variabele en bijvoorbeeld een maximale waarde zijn. Het kan ook het resultaat van een functie of iedere andere expressie zijn, die als waar of onwaar kan worden beoordeeld.
Alle code tussen de accolades wordt net zolang herhaald als de voorwaarde waar is. Zodra de voorwaarde niet of niet meer waar is, wordt de loop afgesloten en gaat de code verder na de sluit-accolade.
Als de voorwaarde om te beginnen al niet waar is, zal de code binnen de loop dus nooit worden uitgevoerd.
Stel je voor, uit een berekening is een hoek gekomen in graden, maar deze hoek ligt niet per se tussen 0° en 360°. Je kunt dan steeds de hoek 360 verlagen, zolang deze groter is dan 360°.
<?php
$hoek = 1250;
while ($hoek > 360) {
$hoek -= 360;
}
?>
In dit voorbeeld heeft de hoek een waarde van 1250°. Dit is groter dan 360, dus de code binnen de while-loop (tussen de accolades) wordt uitgevoerd. Hierbij wordt de waarde van de hoek verlaagd met 360. De hoek wordt de nu 1250 - 360 = 890. Dit is nog steeds groter dan 360, dus wordt er nogmaals 360 vanaf gehaald. De hoek is nu 530. Ook dit is nog groter dan 360, dus wordt de hoek wederom verlaagd met 360 tot 170.
Nu is de hoek niet meer groter dan 360. De voorwaarde voor de while-loop is dus niet meer waar. De code binnen de loop wordt nu niet nog een keer uitgevoerd en de code gaat verder na de laatste accolade.
Stel je voor, je wilt de getallen 1 tot en met 10 onder elkaar op het scherm zetten. Je kunt dan handmatig 10 paragrafen in de html-code zetten, maar je kunt het eenvoudiger met een loop laten automatiseren.
<?php
$getal = 1;
while ($getal <= 10) {
?>
<p><?= $getal ?></p>
<?php
$getal++;
}
?>
In dit voorbeeld krijgt de variabele getal de waarde 1. De while-loop daarna gaat de code tussen de accolades herhalen zolang de variabele getal kleiner of gelijk aan 10 is. Getal is 1 en dus kleiner of gelijk aan 10. Er wordt nu een paragraaf in de output gezet met de waarde van getal (1) erin. Op de volgende regel wordt getal met een verhoogd. Getal is nu dus 2. Dit is nog steeds kleiner of gelijk aan 10 en dus wordt er opnieuw een paragraaf met de waarde van getal (nu 2) in de output gezet en getal weer met 1 verhoogd.
Dit gaat zo een aantal keer door tot getal de waarde 10 heeft gekregen. Getal is dan nog steeds kleiner of gelijk aan 10 (gelijk). Er wordt dus ook nu weer een paragraaf met de waarde van getal (nu 10) in de output gezet en getal weer met 1 verhoogd. Nu is getal (11) niet meer kleiner of gelijk aan 10 en zal de loop stoppen.
Het tweede voorbeeld bij de while-loops is een situatie die vaak voorkomt; een variabele krijgt een beginwaarde, een loop wordt tot of tot en met een bepaalde waarde voor die variabele herhaald en binnen de loop wordt de variabele steeds verhoogd. De variabele krijgt daarmee de functie van een tellertje. Getal begon in het voorbeeld bij 1, de loop ging door tot en met (<=) 10 en getal werd steeds met 1 verhoogd.
Een for-loop is een verkorte notatie voor deze situatie. In plaats van drie aparte regels worden hierbij de beginwaarde voor het tellertje, de voorwaarde hoelang de loop moet worden herhaald en wat er steeds met het tellertje moet gebeuren in 1 commando genoteerd.
for ( beginwaarde ; voorwaarde ; stap ) {
...
}
Hierin geef je bij de beginwaarde een variabele (het tellertje) een waarde waarmee deze moet beginnen.
Alle code tussen de accolades wordt net zolang herhaald als de voorwaarde waar is. Hiermee geef je dus eigenlijk een eindwaarde op, waarbij het tellertje vaak tot (<) of tot en met (<=) een bepaald maximum moet worden herhaald.
Met de stap geef je aan wat er na iedere herhaling met het tellertje moet gebeuren. In veel gevallen zal het tellertje steeds 1 hoger moeten worden (++)
Als tellertje wordt vaan de variabele $i gebruikt. Dit komt van index. Het is echter helemaal geen verplichting om de variabele $i te gebruiken. Er zijn zelfs situaties te bedenken waaring dat juist niet mag.
Het tweede voorbeeld bij de while-loops is hiermee te verkorten tot de volgende code. De werking is exact hetzelfde.
<?php
for ($getal = 1; $getal <= 10; $getal++) {
?>
<p><?= $getal ?></p>
<?php
}
?>
Wanneer je een zogenaamde array hebt, kun je een for-loop gemakkelijk gebruiken om een voor een ieder element in die array langs te gaan. Let er daarbij op dat de index van het eerste element in een array 0 is.
Als ik bijvoorbeeld een ongeordende lijst met de namen van de dagen wil weergeven en ik heb een array met daarin deze namen, kan ik met een for-loop eenvoudig voor iedere dag dezelfde acties laten uitvoeren.
<ul>
<?php
$dagen = ["maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag"];
for ($i = 0; $i < count($dagen); $i++) {
?>
<li><?= $dagen[$i] ?></li>
<?php
}
?>
</ul>
Het tellertje (i) krijgt hier de waarde 0 als beginwaarde (maandag heeft index 0) en de loop wordt herhaald zolang i kleiner is dan 7 (het aantal dagen), waarbij i iedere keer 1 hoger wordt. Merk op dat iedere keer het 'huidige' element uit de array genoteerd wordt door de variabele gevolgd door het tellertje als index tussen rechte haken ($dagen[$i]).
Het tweede voorbeeld bij de for-loops is een situatie die vaak voorkomt; je herhaalt bepaalde acties voor ieder element in een array.
Een foreach-loop is een verkorte notatie voor deze situatie. In plaats met een for-loop een tellertje van 0 tot het aantal elementen in de betreffende array te laten lopen, kan dit in foreach-loop geautomatiseerd worden. De acties binnen de loop worden automatisch voor ieder element in de array een keer uitgevoerd.
foreach ( array as element ) {
...
}
foreach ( array as index => element ) {
...
}
Hierin is array de array of variabele, waarin de array ligt opgeslagen, waarvan je voor ieder element bepaalde acties wilt laten uitvoeren. Het element is een variabele, waarin binnen de loop voor ieder element steeds de waarde wordt opgeslagen.
Je kunt (optioneel) een variabele opgeven voor index. Deze komt voor element en wordt gevolgd door de operator =>. Wanneer deze wordt opgegeven heb je binnen de loop naast de waarde van ieder element ook de beschikking over de index van ieder element.
Het tweede voorbeeld bij de for-loops is hiermee te vereenvoudigen tot de volgende code. De werking is exact hetzelfde.
<ul>
<?php
$dagen = ["maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag"];
foreach ($dagen as $dag) {
?>
<li><?= $dag ?></li>
<?php
}
?>
</ul>
Merk op dat hier het 'huidige' element uit de array niet genoteerd hoeft te worden door de variabele gevolgd door een index tussen rechte haken ($dagen[$i]), maar dat de variabele die je als element hebt opgegeven ($dag) volstaat.
<?php
$stappen = [ 1 => "Een lege beker onder de uitloop plaatsen."
, "De knop voor het gewenste product indrukken."
, "Wachten tot het doorlopen afgerond is."
, "De gevulde beker pakken."
];
foreach ($stappen as $index => $stap) {
?>
<p><b>Stap <?= $index ?></b>: <?= $stap ?></p>
<?php
}
?>
Merk op dat hier het 'huidige' element uit de array niet genoteerd hoeft te worden door de variabele gevolgd door een index tussen rechte haken ($dagen[$i]), maar dat de variabele die je als element hebt opgegeven ($dag) volstaat.
Met het break-statement is het mogelijk om een loop voortijdig te beƫindigen, bijvoorbeeld wanneer aan een bepaalde voorwaarde is voldaan.
break;
break niveau;
Hierbij kun je (optioneel) een niveau opgeven. Wanneer dit wordt weggelaten staat dit gelijk aan niveau 1.
Het niveau kun je alleen gebruiken wanneer je gebruikt maakt van geneste loops (loops in loops). Bij niveau 1 of weggelaten, wordt de huidige loop beƫindigd, bij iedere andere waarde worden zoveel geneste loops terug allemaal afgebroken.
<?php
$naald = 25;
$hooiberg = [1, 36, 2, 34, 25, 35, 46];
$gevonden = false;
for ($i = 0; $i < count($hooiberg); $i++) {
if ($naald == $hooiberg[$i]) {
$gevonden = true;
?>
<p>De waarde <?= $naald ?> is in de lijst gevonden bij index <?= $i ?>.</p>
<?php
break;
}
}
?>
In dit voorbeeld wordt met een for-loop in de array hooiberg gezocht naar de waarde van de variabele naald. Wanneer de waarde is gevonden, hoeft de loop de resterende elementen natuurlijk niet ook nog te doorlopen. Het break-statement zorgt er hier dus voor dat de loop stopt zodra de gezochte waarde gevonden.
Met het continue-statement is het mogelijk om in een loop tussentijds meteen naar de volgende herhaling te springen, bijvoorbeeld wanneer aan een bepaalde voorwaarde is voldaan.
continue;
continue niveau;
Hierbij kun je (optioneel) een niveau opgeven. Wanneer dit wordt weggelaten staat dit gelijk aan niveau 1.
Het niveau kun je alleen gebruiken wanneer je gebruikt maakt van geneste loops (loops in loops). Bij niveau 1 of weggelaten, wordt er in de huidige loop naar de volgende herhaling gesprongen, bij iedere andere waarde wordt in zoveelste geneste loop naar de volgende herhaling gesprongen (alle daarbinnen liggende loops worden afgebroken).
<?php
$prijs = 3.95;
$aantallen = [3, 0, 2, 0, 0, 7, 5];
foreach ($aantallen as $aantal) {
if ($aantal == 0) {
continue;
}
$bedrag = number_format($aantal * $prijs, 2, ",", "");
?>
<p><?= $aantal ?> stuks kosten € <?= $bedrag ?>.</p>
<?php
}
?>
In dit voorbeeld wordt een lijst met aantallen met een foreach-loop doorlopen, waarbij voor ieder element het te betalen bedrag voor het betreffende aantal wordt getoont. Wanneer het aantal 0 is hoeft er natuurlijk niets getoont te worden; deze kunnen worden overgeslagen. Met het continue-statement wordt hier in die gevallen meteen naar het volgende element in de lijst gesprongen.