๐Ÿ“š

PHP ยท Les 5

Arrays

Indexed, associatieve en geneste arrays, array_push, array_map en filter ยท 25 min

Indexed arrays

Indexed arrays slaan waarden op met automatische numerieke sleutels (0, 1, 2, โ€ฆ).

<?php
// Aanmaken
$kleuren = ["rood", "groen", "blauw"];
$cijfers = [1, 2, 3, 4, 5];
$gemixed = ["Jan", 20, true, null];

// Opvragen via index (begint bij 0)
echo $kleuren[0];  // rood
echo $kleuren[2];  // blauw

// Lengte
echo count($kleuren);  // 3

// Toevoegen
$kleuren[] = "geel";          // Toevoegen aan het einde
array_push($kleuren, "wit");  // Zelfde effect

// Verwijderen
$laatste = array_pop($kleuren);    // Verwijder & geef terug: "wit"
$eerste  = array_shift($kleuren);  // Verwijder vooraan: "rood"
array_unshift($kleuren, "zwart"); // Voeg vooraan toe

// Controleren
echo in_array("groen", $kleuren) ? "gevonden\n" : "niet gevonden\n";
echo array_search("groen", $kleuren);  // Geeft de index terug

โš ๏ธ Let op verschil met JS

PHP-arrays zijn vergelijkbaar met JS-arrays. Groot verschil: PHP heeft losse functies (array_push(), count()), terwijl JS methoden heeft (.push(), .length). In PHP is count() een functie, geen property.

Associatieve arrays

Associatieve arrays gebruiken string-sleutels in plaats van numerieke indices. Ze zijn vergelijkbaar met JS-objecten.

<?php
// Aanmaken
$gebruiker = [
    "naam"     => "Jan de Vries",
    "leeftijd" => 20,
    "email"    => "jan@example.com",
    "actief"   => true,
];

// Opvragen
echo $gebruiker["naam"];     // Jan de Vries
echo $gebruiker["leeftijd"]; // 20

// Toevoegen / wijzigen
$gebruiker["stad"] = "Amsterdam";
$gebruiker["leeftijd"] = 21;

// Verwijderen
unset($gebruiker["actief"]);

// Sleutels en waarden
$sleutels = array_keys($gebruiker);
$waarden  = array_values($gebruiker);

print_r($sleutels);

// Controleren of sleutel bestaat
if (array_key_exists("email", $gebruiker)) {
    echo "Email: " . $gebruiker["email"] . "\n";
}

// isset() โ€” ook bruikbaar (false als null)
if (isset($gebruiker["stad"])) {
    echo "Stad: " . $gebruiker["stad"] . "\n";
}

โš ๏ธ Let op verschil met JS

In JS gebruik je objecten ({}) voor key-value paren en arrays ([]) voor lijsten. In PHP is het allemaal รฉรฉn array-type. $obj["key"] is in PHP hetzelfde als obj.key in JS.

๐Ÿ”— Komt terug in Symfony

Symfony's Request-object heeft parameters als associatieve arrays: $request->query->all() geeft een array van GET-parameters terug. Doctrine-query resultaten zijn arrays van Entity-objecten.

Handige array-functies

<?php
$nummers = [5, 2, 8, 1, 9, 3];

// Sorteren
sort($nummers);           // Oplopend: [1,2,3,5,8,9]
rsort($nummers);          // Aflopend
asort($assoc);            // Associatief sorteren (behoudt sleutels)
ksort($assoc);            // Op sleutel sorteren

// Slice en splice
$deel = array_slice($nummers, 1, 3);  // [2, 3, 5] (start, lengte)
array_splice($nummers, 1, 2);         // Verwijder 2 elementen op index 1

// Samenvoegen
$a = [1, 2];
$b = [3, 4];
$samengevoegd = array_merge($a, $b);  // [1, 2, 3, 4]

// Unieke waarden
$dubbel  = [1, 2, 2, 3, 3, 3];
$uniek   = array_unique($dubbel);     // [1, 2, 3]

// Omkeren
$omgekeerd = array_reverse($nummers);

// Sommen
echo array_sum([1, 2, 3, 4]);   // 10
echo max([1, 5, 3]);            // 5
echo min([1, 5, 3]);            // 1

// Doorzoeken
$pos = array_search(8, $nummers);     // Geeft index terug of false
var_dump(in_array(8, $nummers));      // bool(true/false)

array_map, array_filter en array_reduce

<?php
$nummers = [1, 2, 3, 4, 5, 6, 7, 8];

// array_map โ€” transformeer elk element
$verdubbeld = array_map(fn($n) => $n * 2, $nummers);
print_r($verdubbeld);  // [2, 4, 6, 8, 10, 12, 14, 16]

// array_filter โ€” filter elementen (behoudt sleutels!)
$even = array_filter($nummers, fn($n) => $n % 2 === 0);
print_r($even);        // [1=>2, 3=>4, 5=>6, 7=>8]

// array_values() na filter om sleutels te resetten
$even = array_values($even);  // [2, 4, 6, 8]

// array_reduce โ€” reduceer naar รฉรฉn waarde
$som = array_reduce($nummers, fn($carry, $item) => $carry + $item, 0);
echo "Som: $som\n";  // 36

// Combineren โ€” alle functies samen
$resultaat = array_reduce(
    array_filter(
        array_map(fn($n) => $n * 2, $nummers),
        fn($n) => $n > 8
    ),
    fn($carry, $item) => $carry + $item,
    0
);
echo "Resultaat: $resultaat\n";  // Som van verdubbelde nummers > 8

โš ๏ธ Let op verschil met JS

In JS: arr.map(fn), arr.filter(fn), arr.reduce(fn, init) โ€” methoden op het array-object. In PHP zijn het losse functies: array_map(fn, arr). Let op de volgorde van argumenten: bij array_map staat de functie eerst, dan de array. Bij array_reduce staat de array eerst.

Geneste arrays

<?php
// Array van arrays โ€” zoals tabelrijen
$producten = [
    ["id" => 1, "naam" => "Laptop",  "prijs" => 899.99, "voorraad" => 5],
    ["id" => 2, "naam" => "Muis",    "prijs" => 24.99,  "voorraad" => 50],
    ["id" => 3, "naam" => "Monitor", "prijs" => 349.00, "voorraad" => 0],
    ["id" => 4, "naam" => "Toetsenb","prijs" => 59.99,  "voorraad" => 12],
];

// Opvragen
echo $producten[0]["naam"];   // Laptop
echo $producten[1]["prijs"];  // 24.99

// Loop
foreach ($producten as $product) {
    $status = $product["voorraad"] > 0 ? "โœ“ op voorraad" : "โœ— uitverkocht";
    printf("%-12s โ‚ฌ%-8.2f %s\n",
        $product["naam"], $product["prijs"], $status);
}

// Filteren โ€” alleen op voorraad
$beschikbaar = array_filter($producten, fn($p) => $p["voorraad"] > 0);

// Sorteren op prijs (usort met eigen vergelijkingsfunctie)
usort($producten, fn($a, $b) => $a["prijs"] <=> $b["prijs"]);
echo "\nGoedkoopste: " . $producten[0]["naam"] . "\n";

๐Ÿ”— Komt terug in Symfony

In Symfony geeft Doctrine normaal objecten terug (Entity-instanties) in plaats van arrays. Maar het patroon โ€” een collectie van items door itereren, filteren en mappen โ€” is exact hetzelfde. Arrays van arrays hier, arrays van Product-objecten in Symfony.

Sandbox

Filter en verwerk de productlijst met array-functies.

// output

Klik op Uitvoeren...

Kennischeck

Les 5 afronden

Ga door naar functies โ†’