Datenbank-Abfragen oder JSON-APIs liefern in PHP häufig mehrdimensionale Arrays, in denen jede Zeile dieselben Felder hat. Sobald nur eine einzelne Spalte oder eine Lookup-Map nach ID gebraucht wird, kommt PHP array_column ins Spiel. Dieses Tutorial zeigt die drei Parameter, einen kompakten Praxisfall mit PDO fetchAll und den Unterschied zu array_map().
Was macht PHP array_column()?
Wer in PHP mit Datenbank-Ergebnissen oder API-Antworten arbeitet, hat es häufig mit mehrdimensionalen Arrays zu tun, die wie eine Tabelle aufgebaut sind. Jede Zeile ist ein assoziatives Array mit denselben Feldern, etwa id, name oder email. Wenn nur eine einzige Spalte gebraucht wird, ist eine foreach-Schleife unnötig umständlich. Genau dafür gibt es PHP array_column: Die Funktion liefert in einem einzigen Aufruf alle Werte einer bestimmten Spalte zurück und kommt mit jeder verschachtelten Datenstruktur zurecht.

Bevor die drei Parameter im Detail besprochen werden, lohnt ein kurzer Blick auf die Vielseitigkeit der Funktion und ihre typischen Einsatzgebiete im Backend.
Das Schöne daran ist die Vielseitigkeit. PHP array_column() arbeitet sowohl mit Arrays von assoziativen Arrays als auch mit Arrays von Objekten. Über den optionalen dritten Parameter lässt sich zudem der Schlüssel des Ergebnis-Arrays steuern, was elegante Lookup-Maps erlaubt. Das Tutorial zeigt Schritt für Schritt, wie die drei Parameter zusammenspielen und welche Praxis-Patterns sich daraus ergeben.
Syntax und die drei Parameter
Die Signatur ist auf den ersten Blick komplex, weil sie drei Parameter hat. In der Praxis braucht man meistens nur die ersten zwei.
<?php
array_column(array $array, int|string|null $column_key, int|string|null $index_key = null): array
Der erste Parameter ist das Eingabe-Array. Der zweite Parameter ist der Schlüssel oder Index der zu extrahierenden Spalte. Der dritte ist optional und bestimmt, welche Werte als Schlüssel des Ergebnis-Arrays dienen sollen. Wer nur die Spaltenwerte braucht, lässt den dritten Parameter weg und bekommt ein numerisch indiziertes Array zurück.
Erstes Beispiel: Namen aus User-Liste
Zum Einstieg ein typisches Szenario. Ein Array von User-Datensätzen liegt vor, jeder mit den Feldern id und name. PHP array_column() liefert in einem Aufruf alle Namen.
<?php
$users = [
['id' => 1, 'name' => 'Anna'],
['id' => 2, 'name' => 'Ben'],
['id' => 3, 'name' => 'Cara'],
];
$namen = array_column($users, 'name');
print_r($namen);
/* Array
(
[0] => Anna
[1] => Ben
[2] => Cara
) */
Das Ergebnis ist ein einfaches Array mit den Namen, neu durchnummeriert ab 0. Wer dasselbe mit foreach schreiben müsste, bräuchte mindestens drei Zeilen Code und eine zusätzliche Variable. Im nächsten Schritt wird der dritte Parameter interessant.
index_key: ID-Lookup-Map bauen
Mit dem dritten Parameter lässt sich das Ergebnis-Array nach einem Spaltenwert indizieren. Das ist perfekt für Lookup-Maps, etwa wenn die ID als Schlüssel und ein zweiter Spaltenwert als Wert dienen sollen.
<?php
$users = [
['id' => 1, 'name' => 'Anna'],
['id' => 2, 'name' => 'Ben'],
['id' => 3, 'name' => 'Cara'],
];
$mapping = array_column($users, 'name', 'id');
print_r($mapping);
/* Array ( [1] => Anna [2] => Ben [3] => Cara ) */
echo $mapping[2];
/* Ausgabe: Ben */
Diese Map lässt sich anschließend mit einer einzigen Zeile abfragen und ist damit der schnellste Weg, einen Wert per ID zu finden. Wer das in einer foreach-Schleife mit Suche schreiben würde, vergeudet Zeilen und macht den Code schwerer lesbar. PHP array_column() ist hier das Werkzeug der Wahl.
Praxisfall PDO fetchAll
Ein typischer Anwendungsfall ist das Ergebnis von PDO fetchAll(). Die Methode liefert ein Array von Datensätzen zurück, das genau das richtige Format für PHP array_column() hat.
<?php
$rows = $pdo->query('SELECT id, email, name FROM users')
->fetchAll(PDO::FETCH_ASSOC);
/* Nur die Mailadressen sammeln */
$emails = array_column($rows, 'email');
/* Lookup-Map ID -> Name fuer schnelles Joinen */
$nameById = array_column($rows, 'name', 'id');
/* Komplette Zeilen, indiziert nach ID */
$rowsById = array_column($rows, null, 'id');
Diese drei Zeilen ersetzen drei foreach-Schleifen mit jeweils eigener Logik. Die letzte Variante ist besonders praktisch: Mit column_key = null wird die ganze Zeile übernommen und nur über den index_key neu indiziert. Damit sind anschließend Zugriffe wie $rowsById[42]['email'] möglich, ohne suchen zu müssen.
Spalten aus Objekt-Listen extrahieren
PHP array_column() arbeitet auch mit Arrays von Objekten, solange die Properties public sind oder die Klasse __get() implementiert. Die Funktion gibt dann genau die Werte der ausgewählten Property zurück. Das ist nützlich, wenn der Code mit Entity-Objekten arbeitet und nicht mit reinen assoziativen Arrays.
<?php
class User {
public function __construct(
public int $id,
public string $name,
public string $email
) {}
}
$users = [
new User(1, 'Anna', 'anna@example.com'),
new User(2, 'Ben', 'ben@example.com'),
new User(3, 'Cara', 'cara@example.com'),
];
$emails = array_column($users, 'email');
$nameById = array_column($users, 'name', 'id');
print_r($nameById);
/* Array ( [1] => Anna [2] => Ben [3] => Cara ) */
Wichtig ist die Sichtbarkeit der Properties. Bei protected oder private Properties greift PHP array_column() nur über die magische __get()-Methode zu. Wer mit Constructor-Promotion und public Properties arbeitet, hat die Funktion direkt in der Hand.
column_key=null für Reorganisation
Ein subtil mächtiger Anwendungsfall ist die reine Reorganisation eines Arrays. Mit column_key = null wird die komplette Zeile übernommen und nur der index_key bestimmt den Schlüssel.
<?php
$produkte = [
['sku' => 'A1', 'preis' => 9.90, 'name' => 'Tasse'],
['sku' => 'B2', 'preis' => 14.50, 'name' => 'Becher'],
['sku' => 'C3', 'preis' => 4.20, 'name' => 'Loeffel'],
];
$bySku = array_column($produkte, null, 'sku');
print_r($bySku['B2']);
/* Array ( [sku] => B2 [preis] => 14.50 [name] => Becher ) */
Diese Variante ist ein One-Liner-Ersatz für eine foreach-Schleife, die ein Array mit eindeutigen Schlüsseln aufbaut. Wer mehrere Lookups auf demselben Datensatz braucht, ist mit dieser Reorganisation deutlich schneller unterwegs.
flowchart TD
A[2D-Array oder Objekt-Liste] --> B[column_key auswaehlen]
B --> C{index_key gesetzt?}
C -->|Nein| D[Numerisch indizierte Liste]
C -->|Ja| E[Map index_key zu column_key]
Unterschied zu array_map und foreach
Im Code-Bestand großer Projekte werden PHP array_column() und array_map() gelegentlich verwechselt. Beide produzieren ein Array, aber die Anwendungsfälle sind unterschiedlich.
<?php
$users = [
['id' => 1, 'name' => 'Anna'],
['id' => 2, 'name' => 'Ben'],
];
/* Mit array_map und Callback */
$namen1 = array_map(fn($u) => $u['name'], $users);
/* Mit array_column, knapper und schneller */
$namen2 = array_column($users, 'name');
PHP array_column() ist die spezialisierte Funktion für Spalten-Extraktion und ist sowohl knapper als auch schneller, weil sie direkt in C implementiert ist und keinen Userland-Callback ausführt. array_map() ist die richtige Wahl, wenn die Werte transformiert werden müssen, etwa für Format-Konvertierungen oder Berechnungen. Reine Spalten-Auslese gehört in die array_column()-Domäne.
Performance und Best Practices
Die Funktion ist intern in C implementiert und damit deutlich schneller als jede Userland-Lösung mit foreach oder array_map. Bei Datensets mit zehntausenden Zeilen lohnt sich der Aufruf besonders, weil er nur einmal die C-Schicht betritt. Trotzdem allokiert PHP array_column() ein neues Array, deshalb sollte das Ergebnis bei mehrfachem Bedarf in einer Variable gecacht werden.
Drei Best Practices haben sich in der Praxis bewährt. Erstens, bei DB-Ergebnissen das Result-Set immer mit FETCH_ASSOC holen, damit die Spalten als String-Schlüssel ansprechbar sind. Zweitens, beim Aufbau von Lookup-Maps darauf achten, dass der index_key eindeutig ist. Doppelte Werte überschreiben sich gegenseitig, ohne Warning. Drittens, bei JSON-Antworten von APIs die Daten zuerst mit json_decode($json, true) als assoziatives Array dekodieren, dann steht PHP array_column() direkt zur Verfügung.
Im Code-Review ist das häufigste Problem ein nicht eindeutiger index_key. Wenn die Datenbank etwa Mehrfach-Zuordnungen liefert, gehen Einträge still verloren. Eine kurze Prüfung mit count($result) === count($input) verrät, ob alles vollständig übernommen wurde.
Fazit
PHP array_column() ist eine elegante Funktion, die das Extrahieren einer Spalte aus mehrdimensionalen Arrays oder Objekt-Listen in einem einzigen Aufruf erledigt. Sie ist knapper und schneller als foreach oder array_map, eignet sich perfekt für DB-Ergebnisse aus PDO und JSON-Antworten von APIs und glänzt besonders beim Bau von Lookup-Maps mit dem index_key-Parameter. Wer die drei Parameter sicher beherrscht und auf eindeutige Index-Werte achtet, spart sich im Alltag viele handgeschriebene Schleifen.