Lippujen käsittely PHP:ssä
Nyt opimme käsittelemään lippuja.
Lippu on erityinen muuttuja, joka
voi saada vain kaksi arvoa: true
ja false. Lippuja käyttämällä voidaan ratkaista
tehtäviä, jotka tarkistavat jonkin puuttumisen:
esimerkiksi voidaan tarkistaa, että taulukossa
ei ole alkiota tietyllä arvolla. Aloitetaan.
Ratkaistaan seuraava tehtävä: annettu taulukko
luvuilla, on tarpeen tarkistaa, onko siinä
alkio arvolla 3 vai ei. Jos
on, tulostetaan '+++', jos ei -
tulostetaan '---'.
Aluksi yritetään tulostaa '+++'.
Tätä varten käydään läpi kaikki taulukkomme alkiot
ja if-lauseella kysytään - onko nykyinen
alkio yhtä suuri kuin arvo 3. Jos on, tulostetaan
'+++':
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
}
}
?>
Mutta ratkaisumme ei ole kovin hyvä: sillä jos
taulukossa on useita arvoja 3,
niin '+++' tulostuu useita
kertoja. Muutetaan taulukkoamme (tehdään
kaksi alkiota arvolla 3) ja varmistutaan tästä:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // tulostaa useita kertoja
}
}
?>
Korjataan ongelma: keskeytetään silmukka
break:llä, jos alkio on jo löytynyt:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
break; // keskeytetään silmukka
}
}
?>
Yritetään nyt tehdä niin, että
jos taulukossa ei ole lainkaan alkioita arvolla
3, tulostuisi '---'. Yleinen
väärinkäsitys on lisätä else
if-lauseeseemme - tässä tapauksessa '---'
tulostuu kaikille alkioille, jotka eivät ole
3:
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // tulostuu alkiolla 3
} else {
echo '---'; // tulostuu alkioilla 1, 2, 4, 5
}
}
?>
Siis, idea lisätä else - huono
idea, ei toimi. Tällaisen tyyppisten tehtävien
ratkaisemiseen (tällaisia tehtäviä esiintyy usein)
käytetään niin kutsuttuja lippuja.
Kuten edellä mainittiin, lippu on sellainen
muuttuja, joka voi saada kaksi arvoa:
true tai false.
Tehdään muuttuja flag
seuraavalla arvolla: jos se on yhtä suuri kuin true,
niin taulukossa on alkio 3, ja jos
false, niin sellaista alkiota ei ole.
Aluksi asetetaan muuttuja flag
arvoon false - eli oletetaan,
että alkiota 3 ei ole taulukossa:
$arr = [1, 2, 3, 4, 5];
$flag = false; // oletetaan, että alkiota 3 ei ole taulukossa
Sitten käynnistetään silmukka if-lauseella kuten teimme
aiemmin. Jos silmukka huomaa, että taulukossa
on alkio 3 - niin asetetaan muuttuja flag
arvoon true ja poistutaan silmukasta
break:llä:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false; // oletetaan, että alkiota 3 ei ole taulukossa
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true; // alkio on olemassa - määritellään muuttuja $flag uudelleen
break; // poistutaan silmukasta
}
}
?>
Vastauksen kysymykseen, onko taulukossa 3
vai ei, voimme antaa vasta silmukan jälkeen.
Ja tämä vastaus meillä on jo: silmukan jälkeen
muuttuja flag on saattanut pysyä false
tai saattanut vaihtaa arvokseen true,
jos silmukka havaitsi taulukossa 3:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
// tässä muuttuja $flag on joko true tai false
?>
Nyt silmukan jälkeen voimme tehdä if-lauseen, joka
katsoo muuttujaan flag ja tulostaa
näytölle '+++' tai '---':
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
if ($flag === true) {
echo '+++';
} else {
echo '---';
}
?>
Annettu taulukko:
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
?>
Tarkista, onko tässä taulukossa alkio
'c'. Jos on - tulosta '+++',
ja jos ei - tulosta '---'.
Kirjoita koodi, joka tarkistaa onko luku alkuluku vai ei. Alkuluku on jaollinen vain ykkösellä ja itsellään, eikä ole jaollinen muilla luvuilla.