Beetje Coderen

Les 5

Arrays

Geïndexeerde en associatieve arrays en arrayfuncties.

⏱ 45–60 minuten leestijd + oefenen

🎯 Na deze les kun je

  • geïndexeerde en associatieve arrays gebruiken
  • met foreach itereren
  • arrayfuncties als array_map en usort toepassen

In Python had je lijsten (list) en woordenboeken (dict). PHP heeft voor allebei één type: de array. Een array is een geordende verzameling van sleutels (keys) met waarden (values). Gebruik je getallen als sleutel, dan werkt hij als een lijst; gebruik je tekst, dan werkt hij als een woordenboek.

Bijna alles in PHP draait om arrays: formulierdata, databaserijen en configuratie komen allemaal als array binnen. Daarom loont het om ze goed te kennen.

Geïndexeerde arrays

<?php
declare(strict_types=1);

$boodschappen = ["melk", "brood", "kaas"];
echo $boodschappen[0] . "\n";      // melk
echo count($boodschappen) . "\n";  // 3

$boodschappen[] = "appels";        // achteraan toevoegen
$boodschappen[1] = "volkorenbrood"; // vervangen
print_r($boodschappen);
melk
3
Array
(
    [0] => melk
    [1] => volkorenbrood
    [2] => kaas
    [3] => appels
)
  • Je schrijft een array met vierkante haken, net als een Python-lijst.
  • De index begint bij 0.
  • $lijst[] = ... voegt achteraan toe; dat is append in Python.
  • count() geeft het aantal elementen (len() in Python).
  • print_r() toont een array leesbaar; var_dump() laat ook de typen zien.

Associatieve arrays

Met tekst als sleutel heb je de PHP-versie van een dict:

$product = [
    "naam"  => "Koffie",
    "prijs" => 2.80,
    "voorraad" => 12,
];

echo $product["naam"] . " kost € " . $product["prijs"] . "\n";
$product["voorraad"] -= 1;
$product["categorie"] = "dranken";   // nieuwe sleutel

De pijl => koppelt een sleutel aan een waarde, waar Python een dubbele punt gebruikt. Een komma na het laatste element mag en is handig: een nieuwe regel toevoegen geeft dan een kleinere wijziging.

Bestaat een sleutel? Gebruik isset() of array_key_exists(). Met de null-coalescing-operator ?? geef je meteen een standaardwaarde:

$korting = $product["korting"] ?? 0;   // 0, want de sleutel bestaat niet

$product["kortnig"] (tikfout) geeft Warning: Undefined array key "kortnig" en de waarde null. Het script stopt niet, dus je rekent verder met een verkeerde waarde. Lees waarschuwingen altijd.

Arrays in arrays

Een lijst van producten is een array van associatieve arrays. Zo ziet data uit een database er later ook uit (les 10):

$prijslijst = [
    ["naam" => "Koffie",   "prijs" => 2.80],
    ["naam" => "Thee",     "prijs" => 2.40],
    ["naam" => "Croissant","prijs" => 2.95],
];
echo $prijslijst[2]["naam"] . "\n";   // Croissant

foreach

Je kent foreach al uit de vorige les. Met as $sleutel => $waarde krijg je ook de sleutel:

$voorraad = ["koffie" => 12, "thee" => 0, "croissant" => 5];

foreach ($voorraad as $product => $aantal) {
    if ($aantal === 0) {
        echo "$product: uitverkocht\n";
    } else {
        echo "$product: $aantal op voorraad\n";
    }
}
koffie: 12 op voorraad
thee: uitverkocht
croissant: 5 op voorraad

foreach werkt op een kopie van elke waarde. $aantal = 0; in de lus verandert de array dus niet. Wil je de array zelf aanpassen, schrijf dan $voorraad[$product] = 0;.

Arrayfuncties

PHP heeft tientallen ingebouwde functies. Deze gebruik je het meest:

Functie Wat doet het Python
in_array($x, $a, true) zit $x erin? (true = strikt) x in a
array_keys($a) / array_values($a) alle sleutels / waarden d.keys() / d.values()
array_sum($a) som sum(a)
sort($a) sorteren (past de array zelf aan) a.sort()
array_map($f, $a) functie op elk element map / list comprehension
array_filter($a, $f) elementen houden waarvoor $f waar is comprehension met if
usort($a, $f) sorteren met eigen vergelijking sort(key=...)

array_map en array_filter krijgen een functie mee. De korte schrijfwijze is een arrow function: fn($x) => .... Meer over functies volgt in les 6.

$prijzen = [2.80, 2.40, 2.95];

$metBtw = array_map(fn($p) => round($p * 1.09, 2), $prijzen);
print_r($metBtw);            // [3.05, 2.62, 3.22]

$duur = array_filter($prijzen, fn($p) => $p > 2.50);
print_r($duur);              // [0 => 2.8, 2 => 2.95]

Let op de uitvoer van array_filter: de oorspronkelijke sleutels blijven behouden (0 en 2). Wil je weer netjes 0, 1, ..., gebruik dan array_values($duur).

Sorteren met usort

usort krijgt een functie die twee elementen vergelijkt. De spaceship-operator <=> geeft -1, 0 of 1 en maakt dat kort:

usort($prijslijst, fn($a, $b) => $a["prijs"] <=> $b["prijs"]);
foreach ($prijslijst as $p) {
    echo $p["naam"] . "\n";
}
Thee
Koffie
Croissant

Uitgewerkt voorbeeld: een bestelling afrekenen

Voorspel het totaal voordat je verder leest.

<?php
declare(strict_types=1);

$prijslijst = ["koffie" => 2.80, "thee" => 2.40, "croissant" => 2.95];
$bestelling = ["koffie" => 2, "croissant" => 1];

$totaal = 0.0;
foreach ($bestelling as $product => $aantal) {
    $regel = $prijslijst[$product] * $aantal;
    $totaal += $regel;
    echo sprintf("%-10s %d x € %.2f = € %.2f\n", $product, $aantal, $prijslijst[$product], $regel);
}
echo sprintf("Totaal: € %.2f\n", $totaal);
koffie     2 x € 2.80 = € 5.60
croissant  1 x € 2.95 = € 2.95
Totaal: € 8.55

%-10s maakt een tekstkolom van 10 tekens breed, links uitgelijnd. Zo staan de bedragen netjes onder elkaar.

Typische fouten

Melding Oorzaak
Warning: Undefined array key 3 Index bestaat niet; een array met 3 elementen loopt van 0 tot 2.
Warning: Array to string conversion Je deed echo $array;. Gebruik print_r of loop erdoorheen.
in_array("1", [1, 2]) is waar Losse vergelijking. Geef true als derde argument mee.

Oefeningen

Oefening 1. Maak een associatieve array $student met naam, opleiding en jaar, en toon: Noor volgt HBO-ICT (jaar 2).

Modelantwoord oefening 1
$student = ["naam" => "Noor", "opleiding" => "HBO-ICT", "jaar" => 2];
echo "{$student['naam']} volgt {$student['opleiding']} (jaar {$student['jaar']}).\n";

Binnen dubbele aanhalingstekens heb je accolades nodig om een arraywaarde met sleutel in te vullen.

Oefening 2. Bereken het gemiddelde van [7.5, 6.0, 8.2, 5.4] en toon het met één decimaal.

Modelantwoord oefening 2
$cijfers = [7.5, 6.0, 8.2, 5.4];
$gemiddelde = array_sum($cijfers) / count($cijfers);
echo number_format($gemiddelde, 1, ',', '') . "\n";   // 6,8

Oefening 3. Houd uit $prijslijst (met naam en prijs) alleen de producten onder € 2,50 over en toon hun namen.

Modelantwoord oefening 3
$goedkoop = array_filter($prijslijst, fn($p) => $p["prijs"] < 2.50);
foreach ($goedkoop as $p) {
    echo $p["naam"] . "\n";
}

Lab: prijslijst en bestelling

  1. Maak bestelling.php met een prijslijst (minstens vier producten) als associatieve array.
  2. Maak een bestelling als array product => aantal.
  3. Toon per regel product, aantal en regelbedrag, en onderaan het totaal met twee decimalen.
  4. Sla een product over dat niet in de prijslijst staat en toon dan onbekend product: ... (tip: isset).
  5. beetje check php-les5

Samenvatting

  • Eén type voor lijst én woordenboek: de array.
  • [] om te maken, $a[] = x om toe te voegen, => voor sleutels.
  • foreach ($a as $k => $v) loopt alles langs.
  • ?? geeft een standaardwaarde als een sleutel ontbreekt.
  • array_map, array_filter, usort met fn en <=> maken bewerkingen kort.

Volgende les: eigen functies schrijven, met typen.

Lab

Prijslijst en bestelling

💻 Dit lab doe je op je eigen computer met Docker. Start de lab-container met (geeft de opdracht een eigen startcommando, gebruik dan dat):

$ docker run -it --rm registry.wizg.it/webhosting/beetje-labs:php-les5

Volg daarna de stappen van de opdracht hierboven. Nog geen Docker? Zie les 14 van Een beetje Linux & Docker. Voor dit lab is er geen live lab in de browser.

Klaar? Controleer je werk met:

$ beetje check php-les5

📝 Quiz: arrays

5 vragen · 70% nodig om te slagen

1. Hoe voeg je 'kaas' achteraan toe aan $lijst?
2. Welk teken koppelt een sleutel aan een waarde in een PHP-array?
3. Wat geeft $a['korting'] ?? 0 als de sleutel niet bestaat?
4. Wat is bijzonder aan het resultaat van array_filter?
5. Wat geeft 3 <=> 5?

Dit was de laatste gratis les

Je hebt les 1–5 van Een beetje PHP gratis gevolgd. Wil je verder? Met één aankoop (€ 24,00, eenmalig) krijg je de overige 20 lessen, de live labs en het certificaat. Geen abonnement.

Cursus kopen en verdergaan