EMZETT.
Login

Kurz: PHP-Arrays sind geordnete Zuordnungen (Schlüssel => Wert). Als Liste haben sie Schlüssel 0, 1, 2 …, als assoziatives Array beliebige Schlüssel (Strings oder Ints).

Teil des Kurses PHP

Kapitel 5 von 15 im Kurs PHP (Abschnitt „Datenstrukturen“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Ein Typ für Listen und Dictionaries

PHP-Arrays sind geordnete Zuordnungen (Schlüssel => Wert). Als Liste haben sie Schlüssel 0, 1, 2 …, als assoziatives Array beliebige Schlüssel (Strings oder Ints).

<?php
$liste = ["Apfel", "Birne", "Kirsche"];
$person = ["name" => "Mia", "alter" => 17, "hobbys" => ["Lesen", "Judo"]];
 
echo $liste[0], " ", $person["name"], " ", $person["hobbys"][1], " ", count($liste), "\n";
$liste[] = "Dattel";                 // anhängen
$person["ort"] = "Berlin";            // hinzufügen
unset($liste[1]);                     // entfernen (Schlüssel bleiben!)
print_r($liste);
print_r(array_values($liste));        // neu durchnummerieren
var_dump(isset($person["ort"]), array_key_exists("alter", $person), in_array("Judo", $person["hobbys"]));

Ausgabe:

Apfel Mia Judo 3
Array
(
    [0] => Apfel
    [2] => Kirsche
    [3] => Dattel
)
Array
(
    [0] => Apfel
    [1] => Kirsche
    [2] => Dattel
)
bool(true)
bool(true)
bool(true)

Funktionen für Listen

<?php
$z = [5, 3, 9, 1];
array_push($z, 7);                    // am Ende
array_unshift($z, 0);                 // am Anfang
echo array_pop($z), array_shift($z), " ", implode(",", $z), "\n";
echo array_sum($z), " ", max($z), " ", min($z), " ", count($z), " ", array_product([2, 3]), "\n";
sort($z);        echo implode(",", $z), "\n";
rsort($z);       echo implode(",", $z), "\n";
echo implode(",", array_reverse($z)), " ", implode(",", array_slice($z, 1, 2)), "\n";
$z2 = [1, 2, 3, 4, 5];
array_splice($z2, 1, 2, ["x"]);       // ersetzt 2 Elemente ab Index 1
echo implode(",", $z2), "\n";
echo implode(",", array_unique([1, 2, 2, 3, 1])), " ", implode(",", array_merge([1], [2, 3])), " ", implode(",", [...[1, 2], ...[3]]), "\n";
echo array_search(9, [5, 9, 1]), " ", implode(",", array_fill(0, 3, "x")), " ", implode(",", array_pad([1], 3, 0)), "\n";
print_r(array_chunk([1, 2, 3, 4, 5], 2));
print_r(array_combine(["a", "b"], [1, 2]));
print_r(array_count_values(["x", "y", "x"]));

Ausgabe:

70 5,3,9,1
18 9 1 4 6
1,3,5,9
9,5,3,1
1,3,5,9 5,3
1,x,4,5
1,2,3 1,2,3 1,2,3
1 x,x,x 1,0,0
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
        )
 
    [1] => Array
        (
            [0] => 3
            [1] => 4
        )
 
    [2] => Array
        (
            [0] => 5
        )
 
)
Array
(
    [a] => 1
    [b] => 2
)
Array
(
    [x] => 2
    [y] => 1
)

Funktionen für assoziative Arrays

<?php
$preise = ["Brot" => 2.5, "Milch" => 1.2, "Käse" => 4.0];
print_r(array_keys($preise));
print_r(array_values($preise));
asort($preise);   print_r($preise);          // nach Wert sortieren, Schlüssel behalten
ksort($preise);   print_r($preise);          // nach Schlüssel
arsort($preise);  echo implode(",", array_keys($preise)), "\n";
print_r(array_flip(["a" => 1, "b" => 2]));
print_r(array_merge(["a" => 1, "b" => 2], ["b" => 3, "c" => 4]));
print_r(["a" => 1, "b" => 2] + ["b" => 9, "c" => 3]);     // + behält links
foreach ($preise as $produkt => $preis) printf("%-6s %5.2f\n", $produkt, $preis);

Ausgabe:

Array
(
    [0] => Brot
    [1] => Milch
    [2] => Käse
)
Array
(
    [0] => 2.5
    [1] => 1.2
    [2] => 4
)
Array
(
    [Milch] => 1.2
    [Brot] => 2.5
    [Käse] => 4
)
Array
(
    [Brot] => 2.5
    [Käse] => 4
    [Milch] => 1.2
)
Käse,Brot,Milch
Array
(
    [1] => a
    [2] => b
)
Array
(
    [a] => 1
    [b] => 3
    [c] => 4
)
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
Käse   4.00
Brot    2.50
Milch   1.20

map, filter, reduce

<?php
$z = [1, 2, 3, 4, 5, 6];
print_r(array_map(fn($x) => $x * $x, $z));
print_r(array_filter($z, fn($x) => $x % 2 === 0));              // behält Schlüssel
print_r(array_values(array_filter($z, fn($x) => $x > 4)));
echo array_reduce($z, fn($summe, $x) => $summe + $x, 0), "\n";
print_r(array_filter(["a" => 1, "b" => 5], fn($v, $k) => $v > 2 && $k !== "x", ARRAY_FILTER_USE_BOTH));
print_r(array_map(null, [1, 2], ["a", "b"]));                    // zip
usort($z, fn($a, $b) => $b <=> $a);                              // eigene Sortierung
echo implode(",", $z), "\n";
$personen = [["n" => "Tom", "a" => 30], ["n" => "Mia", "a" => 17], ["n" => "Zoe", "a" => 17]];
usort($personen, fn($a, $b) => [$a["a"], $a["n"]] <=> [$b["a"], $b["n"]]);
echo implode(",", array_column($personen, "n")), "\n";
print_r(array_column($personen, "a", "n"));

Ausgabe:

Array
(
    [0] => 1
    [1] => 4
    [2] => 9
    [3] => 16
    [4] => 25
    [5] => 36
)
Array
(
    [1] => 2
    [3] => 4
    [5] => 6
)
Array
(
    [0] => 5
    [1] => 6
)
21
Array
(
    [b] => 5
)
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => a
        )
 
    [1] => Array
        (
            [0] => 2
            [1] => b
        )
 
)
6,5,4,3,2,1
Mia,Zoe,Tom
Array
(
    [Mia] => 17
    [Zoe] => 17
    [Tom] => 30
)

Mehrdimensionale Arrays und Destrukturierung

<?php
$matrix = [[1, 2, 3], [4, 5, 6]];
echo $matrix[1][2], "\n";
foreach ($matrix as $zeile) echo implode(" ", $zeile), "\n";
$kunden = [
    ["name" => "Mia", "punkte" => 120],
    ["name" => "Tom", "punkte" => 80],
];
foreach ($kunden as ["name" => $n, "punkte" => $p]) echo "$n: $p\n";
echo json_encode(array_map(null, ...$matrix)), "\n";             // transponieren

Ausgabe:

6
1 2 3
4 5 6
Mia: 120
Tom: 80
[[1,4],[2,5],[3,6]]

Merke

  • Arrays sind geordnete Schlüssel/Wert-Zuordnungen für Listen und Dictionaries
  • [] anhängen, unset entfernt, isset/array_key_exists prüfen
  • sort, asort, ksort, usort sortieren; Zusatz r = absteigend
  • array_map, array_filter, array_reduce mit Pfeilfunktionen fn
  • ... entpackt Arrays, [$a, $b] = ... destrukturiert
  • Arrays werden bei Zuweisung kopiert (Copy-on-Write)

Übungsaufgabe

Gruppiere eine Liste von Wörtern nach Anfangsbuchstaben in ein assoziatives Array und gib die Gruppen sortiert aus.

Quiz zur Selbstkontrolle

= 5?

  • Hängt 5 ans Ende an (richtig)
  • Ersetzt das erste Element
  • Löscht das Array
  • Wirft einen Fehler

Weiter im Kurs

Zurück: Kontrollfluss: if, match, Schleifen

Weiter: Funktionen

Alle Kapitel: PHP im Überblick