Condities ofwel voorwaardelijke structuren

if(…){ … } else{ … } if(…){ … } elseif(…){} else{ … } switch

Voorwaardelijke uitvoering met if en else

In dit hoofdstuk wordt het nemen van beslissingen in programmacode in PhP behandeld. De structuur die we daar voor nodig hebben in PhP is gelijk aan die in Javascript.

Aan het einde van deze les weet je :

  • hoe je een vergelijkingsstructuur kunt opzetten;
  • hoe je een vergelijking in PhP programmeert;
  • hoe je een vergelijking programmeert in combinatie met formulieren;
  • wat een switch structuur is;

Ter herinnering: Als je een programma ontwikkelt op basis van de invoer van de gebruiker zul je (net als bij Javascript) vaak een test moeten uitvoeren om de invoer te controleren. Is er wel een wachtwoord van minstens 8 tekens ingevoerd? Is de invoer om te zetten naar een getal? Is het salaris ingevoerd door de gebruiker voldoende om een hypotheek te krijgen? ...

Voor een gebruikersvriendelijk programma moet een gebruiker altijd een reactie op de invoer krijgen. Zowel op goede als op slechte invoer. Hoe doen we dat in PhP? We bekijken het voorbeeld dat ook in de Javascript module is behandeld:

voorbeeld

Bij een evenement kost een toegangskaart 10 euro. In een aantal gevallen wordt er korting gegeven. Een kind jonger dan 10 jaar krijgt 2,05 euro korting. Als 65+ krijg je 1,55 euro korting. De invoer die we hier moeten krijgen is de leeftijd van een persoon. Op basis van de ingevoerde leeftijd wordt de prijs van het toegangskaartje bepaald. Ofwel we moeten een Als … dit anders … dat ( if … else … ) structuur gaan gebruiken.

In het voorbeeld, dat ook als video is te bekijken, starten we met voorbeeld3 met formulier uit de sectie Basiselementen. Kopieer de code en sla het op als voorbeeld10.php. In het probleem moet een leeftijd worden ingevuld. Volgens het logische naamgeving principe passen we de code als volgt aan:

<?php
//voorbeeld10
//Met bovenstaand commando open je de PhP mode in een PhP document

// Maak variabelen aan die nodig zijn in het programma
// variabelen voor opslag GET request: 
$leeftijd=30; // leeftijd. Standaard zetten we de leeftijd op 30
// overige variabelen:
$uitvoer = "";

//test of de optie leeftijd in de url aanwezig is. Die informatie vind je in de array $_GET
if( isset($_GET['leeftijd']) ) // isset is een functie die kijkt of een element in een array bestaat
{
  $leeftijd=(double)$_GET['leeftijd']; // lees ingevoerde leeftijd in als double
}

$prijs = 10.0; // Zet standaard prijs op 10 euro;
$uitvoer = "Hallo maatje, jij bent $leeftijd jaar.<br/>Je kaartje kost $prijs &euro;";

echo <<<END
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>    
<title>Voorbeeld 10</title>
<link href="voorbeeld.css" rel="stylesheet" type="text/css">
</head>
<body>
<form action="voorbeeld10.php" method="GET">
<!-- action attribute verwijst naar het PhP document dat het formulier moet verwerken.
  In dit geval dus het zelfde document als het document die het formulier bevat.
--> 
<table>
<tr>
  <td>Voer je leeftijd in</td>
  <td>
    <!-- Defineer een invoerveld net als in Javascript. 
            Echter hier gebruiken we het "name" attribuut inplaats van het "id"
            om naar de invoer te verwijzen.
    -->
    <input name="leeftijd" value=""/></td>
</tr>
<tr>
  <td colspan="2"><input type="submit" name="knop" value="Verstuur"/></td>
</tr>
</table>
</form>
<!-- We geven de uitvoer ook even een eigen plekje -->
<p class="uitvoer">
$uitvoer
</p>
</body>
</html>
END;
//einde van het PhP blok
?>

In de code hierboven wordt is al voorwaardelijke structuur gebruikt. Kun je die plek vinden?
Je ziet ook hier gebruiken we de if..else structuur. Een if .. else structuur heeft de volgende syntax

     if ( logische vergelijking ) // Volg de verwijzing en bestudeer alle logische vergelijkingen. 
     {
      // code als de vergelijking true (waar) is
     }
     else
     {
      // code als de vergelijking false (niet waar) is
     }

We voegen de voorwaardelijke structuur toe voor de situatie dat een persoon 65 jaar of ouder is.

$prijs = 10.0; // Zet standaard prijs op 10 euro;

if($leeftijd >= 65) // als de leeftijd 65 of groter is
{
 $prijs -= 1.55;
}

$uitvoer = "Hallo maatje, jij bent $leeftijd jaar.<br/>Je kaartje kost $prijs &euro;";

We willen de situatie toevoegen dat een persoon jonger is dan 10 jaar. Dit lossen we op door de conditie structuur voor de jeugd te nesten binnen de conditie structuur van de bejaarde. Een algemene opzet is:

     if ( logische vergelijking )
     {
      // code als de vergelijking true (waar) is
     }
     else
     {
       if ( logische vergelijking2 )
       {
        // code als de vergelijking2 true (waar) is
       }
       else
       {
        // code als de vergelijking2 false (niet waar) is
       }
     }

In het voorbeeld wordt de structuur dan

  if( $leeftijd >= 65 )  // als de leeftijd 65 of groter is
  {   // dan verlagen we de prijs
    $prijs = $prijs - 1.55;
  }
  else
  {   
    if( leeftijd < 10 )  // als de leeftijd kleiner is dan 10
    {   // dan verlagen we de prijs
       $prijs = $prijs - 2.05;
    }
    else
    { // Doen we niets
    }
  }

Voorwaardelijke uitvoering met if elseif en else

PhP heeft nog een constructie voor nesten die iets eenvoudiger is dan bovenstaande constructie. Namelijk de elseif statement. Het code voorbeeld wordt dan:

  if( $leeftijd >= 65 )  // als de leeftijd groter is dan 65
  {   // dan verlagen we de prijs
     $prijs = $prijs - 1.55;
  }
  elseif( leeftijd < 10 )  // als de leeftijd kleiner is dan 10
  {   // dan verlagen we de prijs
     $prijs = $prijs - 2.05;
  }
  else
  { // Doen we niets
  }

Je zult merken dat je nog steeds geen zinvolle melding krijgt als er een negatieve leeftijd wordt in gevoerd of als het in het geheel geen getal is. We voegen controles voor deze situaties toe. Bestudeer de code goed want dit is echt al een volwaardig programma en bevat code die je vaak zal inzetten.

<?php
//voorbeeld10
//Met bovenstaand commando open je de PhP mode in een PhP document

// Maak een variabele waarin we het GET request gaan opslaan
$leeftijd=30;  // Standaard zetten we de leeftijd op 30
$fout = false; // Vlag voor foute invoer

//invoer controle
//test of de optie leeftijd in de url aanwezig is. Die informatie vind je in de array $_GET
if( isset($_GET['leeftijd']) ) // isset is een functie die kijkt of een element in een array bestaat
{
  $leeftijd=$_GET['leeftijd']; // lees ingevoerde leeftijd in
  if( is_numeric($leeftijd) ) // test of de invoer een getal is
  {		
    $leeftijd=(double)$leeftijd; // Maak van leeftijd een double
  }
  else // invoer is geen getal
  {
    $fout = true;
    $uitvoer="Er moet een getal worden ingevuld";
  }
}
else // Er is nog geen formulier opgestuurd
{
 $fout = true;
 $uitvoer="Vul een leeftijd in";
}
//einde controle

//begin verwerking invoer
if(!$fout)
{
  $prijs = 10.0; // Zet standaard prijs op 10 euro;
  if( $leeftijd >= 65 )  // als de leeftijd groter is dan 65
  {   // dan verlagen we de prijs
       $prijs = $prijs - 1.55;
  }
  elseif ($leeftijd >= 10 )  // als de leeftijd 10 of hoger
  {   // dan is prijs 10 euro
       $prijs = 10.0;
  }
  elseif ($leeftijd >= 0 )
  { // dan verlagen we de prijs
       $prijs = $prijs - 2.05;
  }
  else
  {
   $fout = true;
   $uitvoer="De leeftijd moet een positief getal zijn";
  }
  if(!$fout) $uitvoer = "Hallo maatje, jij bent $leeftijd jaar.<br/>Je kaartje kost $prijs &euro;";
}
//einde verwerking invoer

Je ziet het wordt al snel gecompliceerd als er aan veel voorwaarden moet worden voldaan.

Opdrachten
  1. Voeg aan het bovenstaande voorbeeld een invoerveld toe waarin de klant een gewenst aantal kaartjes kan invullen en laat de totale prijs zien. Ga er hierbij vanuit dat alle kaartjes voor de zelfde leeftijd zijn. Controleer weer op getallen.
  2. Voeg nu ook de mogelijkheid toe om kaartjes voor verschillende leeftijden te reserveren. Verwijder daartoe het invullen van de leeftijd en maak voor iedere leeftijd een aparte invoer voor het aantal gewenste kaartjes. Controleer weer op getallen.
  3. Inleveropdracht: Pizza Plazza:
    In deze opdracht moet je een bestelformulier maken waarin een klant online pizza's kan bestellen met de volgende regels:
    • De klant kan kleine, normale of grote pizza's bestellen.
    • Een kleine pizza (1 persoons) kost 6€
    • Een normale pizza(1-2 persoons) kost 8€
    • Een grote pizza (3-4 persoons) kost 12€
    • Bij een bestelling van meer dan 3 pizza's krijgt de klant 10 procent korting.
    • De klant moet deze informatie kunnen zien.
    • De klant moet gewenste aantallen kunnen invullen en opsturen.
    • De klant moet een overzicht krijgen over het aantal bestelde pizza's van ieder soort, de prijs per soort en de totaal prijs.
    • Zorg voor een overzichtelijke tabel in zowel invoer als uitvoer
    Aanpak: Begin met slechts één type pizza en voeg daarna de andere typen toe.

Voorwaardelijke uitvoering met switch

switch

Vaak is er op een website een menu te vinden. Het huidige idee over programmeren in PhP is dat alle acties in een website in één PhP document gecoördineerd wordt. Er kunnen veel menukeuzes zijn. Er moet dus op basis van de keuze een actie worden uitgevoerd. Met behulp van if … else … condities is dit mogelijk. Als het een uitgebreid menu is wordt dat al snel onoverzichtelijk. Een betere optie is de switch{ ... } structuur. De switch structuur is ook aanwezig in Javascript en vele andere talen. Een switch structuur kun je ook een plaats geven in een flowchart. Klik voor een flowchart voor voorbeeld 11.

Opdrachten
  1. In voorbeeld11 hieronder is een deel vet gedrukt. Hierin is de switch constructie aanwezig. Neem de code over en sla het op onder de naam voorbeeld11.php en bekijk het in de browser. Voeg commentaar toe: Leg daarin uit wat in de switch structur case betekent en wat default betekent. In de code is ook fout controle aanwezig. Waar is die te vinden?
  2. Voeg in voorbeeld11 de volgende acties toe: en (Tip)
  3. Maak een applicatie met daarin een switch constructie voor een annuïteiten hypotheek. Maak eerst de bijbehorende flowchart.
    Er moeten de volgende invoervelden aanwezig zijn: "hypotheek bedrag", "rente op jaar basis", "maandelijkse aflossing" en "Looptijd in jaren" en de volgende knoppen:
    en .

    Noem H het hypotheek bedrag, M de maandelijkse aflossing, p de rente op jaarbasis en n de looptijd in jaren. Dan kun je de volgende formules gebruiken waarin r=1+p/100:
    maandelijkse aflossing:M=H × rn × (r1/12-1) / (rn-1)
    maximale hypotheek:H = M × r-n × (rn-1)/(r1/12-1)
    minimale looptijd:n=log( M /(M-H(r1/12-1)))/log(r)
voorbeeld11

Onderstaand voorbeeld is ook als video beschikbaar.

<?php
//voorbeeld11
//Met bovenstaand commando open je de PhP mode in een PhP document

// Maak een variabele waarin we het GET request gaan opslaan
$getal1=0; 	 // ..
$getal2=0; 	 // ..
$uitvoer=""; // ..
$fout1="";   // ..
$fout2="";   // ..
$knop="";    // ..

$fout = false; // Vlag voor foute invoer

// invoer
//test of de optie knop in de url aanwezig is. Die informatie vind je in de array $_GET
if( isset($_GET['knop']) ) // isset is een functie die kijkt of een element in een array bestaat
{
 $knop=$_GET['knop']; // lees ingevoerde leeftijd in
}
//test of de optie getal1 in de url aanwezig is. Die informatie vind je in de array $_GET
if( isset($_GET['getal1']) ) // isset is een functie die kijkt of een element in een array bestaat
{
  $getal1=$_GET['getal1']; // lees ingevoerde getal in
  if( is_numeric($getal1) ) // test of de invoer een getal is
  {		
      $getal1=(double)$getal1; // Maak van getal1 een double
  }
  else // invoer is geen getal
  {
   $fout = true;
   $fout1="Er moet een getal worden ingevuld";
  }
}
//test of de optie getal2 in de url aanwezig is. Die informatie vind je in de array $_GET
if( isset($_GET['getal2']) ) // isset is een functie die kijkt of een element in een array bestaat
{
 $getal2=$_GET['getal2']; // lees ingevoerde getal in
 if( is_numeric($getal2) ) // test of de invoer een getal is
 {		
      $getal2=(double)$getal2; // Maak van getal2 een double
 }
 else // invoer is geen getal
 {
   $fout = true;
   $fout2="Er moet een getal worden ingevuld";
 }
}
// einde invoer
// verwerking
if(!$fout)
{
 switch($knop) // Reageer op de actie van de knop
 {
  // Geval optellen
  case "telop": $uitvoer = "$getal1 + $getal2 = ".($getal1+$getal2);
                break;
 	// Geval aftrekken
  case "trekaf": $uitvoer = "$getal1 - $getal2 = ".($getal1 - $getal2);
                break;
  default: $uitvoer="";
                break;
 }
}
//einde verwerking

// uitvoer
echo <<<END
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>    
<title>Voorbeeld 11</title>
<link href="voorbeeld.css" rel="stylesheet" type="text/css">
</head>
<body>
<form action="voorbeeld11.php" method="GET">
<table>
<tr>
  <td>Geef een getal</td>
  <td><input name="getal1" value="$getal1"/></td>
  <td>$fout1</td>
</tr>
<tr>
  <td>Geef nog een getal</td>
  <td><input name="getal2" value="$getal2"/></td>
  <td>$fout2</td>
</tr>
<tr>
  <td colspan="3">
    <input type="submit" name="knop" value="telop"/>
    <input type="submit" name="knop" value="trekaf"/>
 </td>
</tr>
</table>
</form>
<!-- We geven de uitvoer ook even een eigen plekje -->
<p class="uitvoer">
$uitvoer
</p>
</body>
</html>
END;
//einde uitvoer
//einde van het PhP blok
?>