Zoeken…
Invoering
Lussen zijn een fundamenteel aspect van programmeren. Hiermee kunnen programmeurs code maken die wordt herhaald voor een bepaald aantal herhalingen of iteraties . Het aantal iteraties kan expliciet zijn (bijvoorbeeld 6 iteraties) of doorgaan totdat aan een voorwaarde is voldaan ('totdat de hel bevriest').
Dit onderwerp behandelt de verschillende soorten lussen, hun bijbehorende besturingsopdrachten en hun mogelijke toepassingen in PHP.
Syntaxis
- voor (init counter; test counter; increment counter) {/ * code * /}
- foreach (array as value) {/ * code * /}
- foreach (array as key => value) {/ * code * /}
- terwijl (staat) {/ * code * /}
- doe {/ * code * /} while (staat);
- anyloop {doorgaan; }
- anyloop {[ anyloop ...] {ga door int; }}
- anyloop {break; }
- anyloop {[ anyloop ...] {break int; }}
Opmerkingen
Het is vaak handig om hetzelfde of een vergelijkbaar codeblok meerdere keren uit te voeren. In plaats van kopiëren en plakken, bieden bijna gelijke instructies loops een mechanisme om code een bepaald aantal keren uit te voeren en over datastructuren te lopen. PHP ondersteunt de volgende vier soorten lussen:
-
for
-
while
-
do..while
-
foreach
Om deze lussen te besturen, zijn continue
en break
instructies beschikbaar.
voor
De
for
instructie wordt gebruikt wanneer u weet hoe vaak u een instructie of een blok instructies wilt uitvoeren.
De initialisatie wordt gebruikt om de startwaarde in te stellen voor de teller van het aantal lusiteraties. Hiertoe kan hier een variabele worden gedeclareerd en het is traditioneel om het $i
te noemen.
In het volgende voorbeeld wordt 10 keer herhaald en worden getallen van 0 tot 9 weergegeven.
for ($i = 0; $i <= 9; $i++) {
echo $i, ',';
}
# Example 2
for ($i = 0; ; $i++) {
if ($i > 9) {
break;
}
echo $i, ',';
}
# Example 3
$i = 0;
for (; ; ) {
if ($i > 9) {
break;
}
echo $i, ',';
$i++;
}
# Example 4
for ($i = 0, $j = 0; $i <= 9; $j += $i, print $i. ',', $i++);
De verwachte output is:
0,1,2,3,4,5,6,7,8,9,
foreach
De instructie
foreach
wordt gebruikt om door arrays te bladeren.
Voor elke iteratie wordt de waarde van het huidige arrayelement toegewezen aan de variabele $value
en de arraypointer wordt één voor één verplaatst en in de volgende iteratie wordt het volgende element verwerkt.
In het volgende voorbeeld worden de items in de toegewezen array weergegeven.
$list = ['apple', 'banana', 'cherry'];
foreach ($list as $value) {
echo "I love to eat {$value}. ";
}
De verwachte output is:
I love to eat apple. I love to eat banana. I love to eat cherry.
U kunt ook toegang krijgen tot de sleutel / index van een waarde met foreach:
foreach ($list as $key => $value) {
echo $key . ":" . $value . " ";
}
//Outputs - 0:apple 1:banana 2:cherry
Standaard is $value
een kopie van de waarde in $list
, dus wijzigingen die in de lus worden aangebracht, worden achteraf niet in $list
.
foreach ($list as $value) {
$value = $value . " pie";
}
echo $list[0]; // Outputs "apple"
Om de array binnen de foreach
lus te wijzigen, gebruikt u de operator &
om $value
toe te wijzen door verwijzing. Het is belangrijk om de variabele achteraf uit te unset
, zodat hergebruik van $value
de array niet overschrijft.
foreach ($list as &$value) { // Or foreach ($list as $key => &$value) {
$value = $value . " pie";
}
unset($value);
echo $list[0]; // Outputs "apple pie"
U kunt de foreach
binnen de foreach
lus ook wijzigen door te verwijzen naar de matrixsleutel van het huidige item.
foreach ($list as $key => $value) {
$list[$key] = $value . " pie";
}
echo $list[0]; // Outputs "apple pie"
breken
Het
break
sleutelwoord beëindigt onmiddellijk de huidige lus.
Net als bij de instructie continue
stopt een break
uitvoering van een lus. In tegenstelling tot een continue
verklaring echter break
zorgt ervoor dat de onmiddellijke beëindiging van de lus en is de voorwaardelijke instructie niet opnieuw uitvoeren.
$i = 5;
while(true) {
echo 120/$i.PHP_EOL;
$i -= 1;
if ($i == 0) {
break;
}
}
Deze code zal produceren
24
30
40
60
120
maar zal niet het geval uitvoeren waarin $i
0 is, wat zou resulteren in een fatale fout vanwege deling door 0.
De break-instructie kan ook worden gebruikt om uit verschillende niveaus van lussen te breken. Dergelijk gedrag is erg handig bij het uitvoeren van geneste lussen. Als u bijvoorbeeld een reeks strings naar een uitvoertekenreeks wilt kopiëren en #
symbolen wilt verwijderen, totdat de uitvoertekenreeks exact 160 tekens bevat
$output = "";
$inputs = array(
"#soblessed #throwbackthursday",
"happy tuesday",
"#nofilter",
/* more inputs */
);
foreach($inputs as $input) {
for($i = 0; $i < strlen($input); $i += 1) {
if ($input[$i] == '#') continue;
$output .= $input[$i];
if (strlen($output) == 160) break 2;
}
$output .= ' ';
}
Het break 2
commando beëindigt onmiddellijk de uitvoering van zowel de binnenste als de buitenste lussen.
doen terwijl
De instructie
do...while
While zal een codeblok ten minste eenmaal uitvoeren - het herhaalt dan de lus zolang een voorwaarde waar is.
In het volgende voorbeeld wordt de waarde van $i
minimaal één keer verhoogd en wordt de variabele $i
verhoogd zolang deze een waarde kleiner dan 25 heeft;
$i = 0;
do {
$i++;
} while($i < 25);
echo 'The final value of i is: ', $i;
De verwachte output is:
The final value of i is: 25
doorgaan met
Het sleutelwoord
continue
stopt de huidige iteratie van een lus maar beëindigt de lus niet.
Net als de break
instructie bevindt de instructie continue
zich in de lus. Wanneer het wordt uitgevoerd, zorgt de instructie continue
ervoor dat de uitvoering onmiddellijk naar de voorwaardelijke lus springt.
In het volgende voorbeeld drukt lus een bericht af op basis van de waarden in een array, maar slaat een opgegeven waarde over.
$list = ['apple', 'banana', 'cherry'];
foreach ($list as $value) {
if ($value == 'banana') {
continue;
}
echo "I love to eat {$value} pie.".PHP_EOL;
}
De verwachte output is:
I love to eat apple pie.
I love to eat cherry pie.
De instructie continue
kan ook worden gebruikt om de uitvoering onmiddellijk voort te zetten naar een buitenste niveau van een lus door het aantal te springen lusniveaus op te geven. Overweeg bijvoorbeeld gegevens zoals
Fruit | Kleur | Kosten |
---|---|---|
appel | Rood | 1 |
Banaan | Geel | 7 |
Kers | Rood | 2 |
Druif | Groen | 4 |
Om alleen taarten te maken van fruit dat minder dan 5 kost
$data = [
[ "Fruit" => "Apple", "Color" => "Red", "Cost" => 1 ],
[ "Fruit" => "Banana", "Color" => "Yellow", "Cost" => 7 ],
[ "Fruit" => "Cherry", "Color" => "Red", "Cost" => 2 ],
[ "Fruit" => "Grape", "Color" => "Green", "Cost" => 4 ]
];
foreach($data as $fruit) {
foreach($fruit as $key => $value) {
if ($key == "Cost" && $value >= 5) {
continue 2;
}
/* make a pie */
}
}
Wanneer de instructie continue 2
wordt uitgevoerd, springt de uitvoering onmiddellijk terug naar $data as $fruit
de buitenste lus voortzet en alle andere code overslaat (inclusief de voorwaardelijke in de binnenste lus).
terwijl
De
while
zal een codeblok uitvoeren als en zolang een testexpressie waar is.
Als de testexpressie waar is, wordt het codeblok uitgevoerd. Nadat de code is uitgevoerd, wordt de testuitdrukking opnieuw geëvalueerd en gaat de lus door totdat de testuitdrukking onwaar blijkt te zijn.
Het volgende voorbeeld herhaalt zich totdat de som 100 bereikt voordat deze wordt beëindigd.
$i = true;
$sum = 0;
while ($i) {
if ($sum === 100) {
$i = false;
} else {
$sum += 10;
}
}
echo 'The sum is: ', $sum;
De verwachte output is:
The sum is: 100