Les 5
Arrays
Geïndexeerde en associatieve arrays en arrayfuncties.
🎯 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 isappendin 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
- Maak
bestelling.phpmet een prijslijst (minstens vier producten) als associatieve array. - Maak een bestelling als array
product => aantal. - Toon per regel product, aantal en regelbedrag, en onderaan het totaal met twee decimalen.
- Sla een product over dat niet in de prijslijst staat en toon dan
onbekend product: ...(tip:isset). beetje check php-les5
Samenvatting
- Eén type voor lijst én woordenboek: de array.
[]om te maken,$a[] = xom toe te voegen,=>voor sleutels.foreach ($a as $k => $v)loopt alles langs.??geeft een standaardwaarde als een sleutel ontbreekt.array_map,array_filter,usortmetfnen<=>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
Klaar? Controleer je werk met:
$ beetje check php-les5
📝 Quiz: arrays
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.