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<?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<?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<?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<?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:

javascript$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<?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<?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<?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 '---';
  }
?>
Задание 1

Annettu taulukko:

php<?php
  $arr = ['a', 'b', 'c', 'd', 'e'];
?>

Tarkista, onko tässä taulukossa alkio 'c'. Jos on - tulosta '+++', ja jos ei - tulosta '---'.

Задание 2

Kirjoita koodi, joka tarkistaa onko luku alkuluku vai ei. Alkuluku on jaollinen vain ykkösellä ja itsellään, eikä ole jaollinen muilla luvuilla.