Guide: Kontrollering av verdier
PHP- & MySQL-innføring: Kapittel 3
Break og continue
Den vanlige måten å stoppe en løkke fra utførelse er at uttrykket/uttrykkene viser seg å være usanne, som vi har sett til nå. break og continue muliggjør imidlertid en alternativ måte å stoppe løkken fra utførelse. break-kommandoen avslutter hele den aktuelle løkken, mens continue-kommandoen hopper over utførelsen av de neste kommandoene.
La oss teste om tall er oddetall eller ikke. Denne testen kjøres slik: $variabel % 2 (% er operatoren for modulo), og variabelen vil deretter få en verdi basert på om den er et oddetall eller ikke. Er det et oddetall vil variabelen få verdien 1, mens hvis det ikke er et oddetall vil den få verdien 0.
for ($tall = 1; $tall < 10; $tall++)
{
if ($tall % 2 != 0)
break;
echo $tall;
}
Eksempelet over vil faktisk ikke returnere noe som helst. Dette er fordi $tall er satt til 1, og som vi vet er det et oddetall. Break vil dermed sette en effektiv stopper for hele løkken.
Hadde vi imidlertid satt verdien til 2 hadde vi fått skrevet ut verdien av variabelen (2), ettersom 2 ikke er et oddetall. Ved neste kjøring av løkken ville imidlertid verdien vært 3, ettersom vi i for-løkken setter verdien av variabelen til sin egen verdi + 1. Verdien blir dermed 3, som er et oddetall. Løkken ville altså ha blitt stoppet av break ved andre kjøring.
for ($tall = 1; $tall < 10; $tall++)
{
if ($tall % 2 != 0)
continue;
echo $tall;
}
Ved første utførelse av løkken vil variabelen ha verdien 1, som er et oddetall, og det blir dermed ikke vist. Ved andre utførelse er imidlertid verdien 2, som ikke er et oddetall. Når løkken er ferdig med utførelsen vil vi ha fått vist tallene 2, 4, 6 og 8. Dette er altså de tallene som ikke er oddetall mellom 1 og 9.
Som sagt hopper continue-kommandoen over utførelsen av de neste kommandoene, men lar løkken kjøre på nytt. Vi kan nå benytte det eksakt samme eksempelet som over, bare at vi har byttet ut break med continue.
Vi kan nå bruke det vi kan i praksis til å konstruere et skript som vil vise alle primtall (tall som kun er delelig med seg selv og 1) opp til et visst tall. Til akkurat dette skriptet er ikke continue nødvendig.
// Grensen for hva som er den høyeste verdien vi kan teste
$grense = 300;
// Hvilken verdi testen starter på
$test = 2;
while (TRUE)
{
$testdivisjon = 2;
// Hvis vi har oversteget den høyeste verdien vi skal teste,
// stopp skriptet
if ($test > $grense)
break;
while (TRUE)
{
if ($testdiv > sqrt($test))
{
// Skriv ut og stopp løkken
echo "$test ";
break;
}
// Sjekk om $test er mulig å dividere med $testdivisjon
if ($test % $testdivisjon == 0)
break;
$testdivisjon++;
}
$test++;
}
Kjører vi dette skriptet skal vi få følgende tall vist:
Det viktige å merke seg her er at break kun vil stoppe den nærmeste løkken den står "inne i". Den vil altså ikke avslutte hoved-løkken, men bare sin egen løkke. Se litt på skriptet, og du skjønner det nok. Som du sikkert ser har vi her benyttet PHP-funksjonen sqrt() til å sjekke kvadratroten.
Akkurat som ved vårt skript som estimerer kvadratrot kan dette skriptet være litt vanskelig å forstå for mange. Jeg kan bare gjenta meg selv - les koden nøyere og test ut ting selv, så går det nok bra!