Wer zwei flache Arrays hat, von denen eines Schlüssel und das andere Werte liefert, kann sie mit PHP array_combine in einem einzigen Aufruf zu einem assoziativen Array zusammenführen. Dieses Tutorial zeigt das Reißverschluss-Prinzip an Beispielen, erklärt den CSV-Header-Trick mit fgetcsv() und gibt einen robusten Schutz gegen den ValueError, der ab PHP 8 bei unterschiedlicher Länge geworfen wird.
Was macht PHP array_combine()?
Wer in PHP mit zwei parallelen Listen arbeitet, etwa Spaltennamen und passenden Werten, sucht oft nach einer eleganten Möglichkeit, beide zu einem assoziativen Array zu verbinden. Genau dafür gibt es PHP array_combine: Die Funktion nimmt ein Schlüssel-Array und ein Werte-Array entgegen, das erste liefert die Schlüssel, das zweite die Werte. Heraus kommt ein neues Array, in dem jeder Schlüssel auf den passenden Wert zeigt.

Bevor das CSV-Import-Pattern und der Pre-Check gegen ValueError folgen, ist es hilfreich, das Reißverschluss-Prinzip dahinter zu verstehen.
Das Prinzip funktioniert wie ein Reißverschluss. Die beiden Listen werden Position für Position miteinander verbunden, und das Ergebnis ist sofort über die übergebenen Schlüssel ansprechbar. In der Praxis löst PHP array_combine() vor allem das CSV-Header-Mapping, also die Frage "wie ordne ich die Werte einer CSV-Zeile den Spaltennamen aus der ersten Zeile zu?". Das Tutorial zeigt Schritt für Schritt, wie die Funktion arbeitet, welche Stolperfallen lauern und wie ein robustes Pattern aussieht.
Syntax und Rückgabewert
Die Signatur ist kurz und gut zu merken. PHP array_combine() erwartet zwei Arrays mit identischer Anzahl Elemente und gibt das fertig kombinierte Array zurück.
<?php
array_combine(array $keys, array $values): array
Der Rückgabewert ist ab PHP 8 immer ein Array. Wenn die Anzahl der Elemente in beiden Arrays nicht übereinstimmt, wirft die Funktion einen ValueError. In älteren PHP-Versionen kam stattdessen ein E_WARNING und false als Rückgabewert. Wer Code zwischen PHP 7 und PHP 8 portieren muss, sollte diese Verhaltensänderung kennen und seinen Aufruf entsprechend absichern.
Erstes Beispiel: Spielernamen und Trikotnummern
Ein eingängiges Beispiel ist eine Vereinsliste, in der die Trikotnummer als Schlüssel dient und der Spielername als Wert. PHP array_combine() spart hier die manuelle foreach-Schleife, die Position für Position das neue Array befüllen müsste.
<?php
$nummern = [7, 10, 23];
$spieler = ['Mueller', 'Schmidt', 'Weber'];
$kader = array_combine($nummern, $spieler);
print_r($kader);
/* Array
(
[7] => Mueller
[10] => Schmidt
[23] => Weber
) */
Das Ergebnis ist ein assoziatives Array, das sich direkt mit $kader[10] ansprechen lässt. Diese Darstellung ist für kleine Datensets übersichtlicher als zwei parallele Arrays, die immer über denselben Index verknüpft werden. Im nächsten Schritt zeigt sich, warum PHP array_combine() besonders im Datei-Import glänzt.
Praxisfall CSV-Header-Mapping mit fgetcsv()
CSV-Dateien sind ein typischer Anwendungsfall. Die erste Zeile enthält die Spaltennamen, die folgenden Zeilen die Daten. Mit fgetcsv() lassen sich CSV-Dateien zeilenweise einlesen, und PHP array_combine() macht aus jeder Datenzeile ein verständliches assoziatives Array.
<?php
$datei = fopen('teilnehmer.csv', 'r');
$header = fgetcsv($datei);
$zeilen = [];
while (($daten = fgetcsv($datei)) !== false) {
/* Schutz vor unvollstaendigen Zeilen, die sonst ValueError werfen */
if (count($daten) === count($header)) {
$zeilen[] = array_combine($header, $daten);
}
}
fclose($datei);
print_r($zeilen[0]);
/* Array
(
[name] => Anna
[alter] => 28
[stadt] => Berlin
) */
Diese kleine Pipeline ist robust und kommt ohne externe Library aus. Wichtig ist der Längen-Check vor dem Aufruf von PHP array_combine(). Eine kaputte CSV-Zeile mit weniger oder mehr Spalten als der Header würde sonst eine Exception werfen und den gesamten Import-Lauf abbrechen.
Stolperfalle ValueError bei unterschiedlicher Länge
Wer ohne Pre-Check arbeitet, läuft früher oder später in den ValueError. Ab PHP 8 ist die Längen-Prüfung Pflicht, wenn die Anwendung den Fehler nicht sauber abfangen soll. Ein einfaches try/catch reicht aus, um auf den Fehler zu reagieren.
<?php
$keys = ['name', 'alter'];
$values = ['Anna', 28, 'Berlin'];
try {
$person = array_combine($keys, $values);
} catch (ValueError $e) {
echo 'Laengen passen nicht: ' . $e->getMessage();
}
/* Ausgabe: Laengen passen nicht: array_combine(): Argument #1 ($keys)
and argument #2 ($values) must have the same number of elements */
Im Produktiv-Code ist die explizite Längenprüfung mit count() die saubere Lösung, weil sie ohne Exception auskommt und einen klaren if/else-Pfad ermöglicht. Try/catch ist dann sinnvoll, wenn die Daten aus einer externen Quelle stammen und Fehler in einem zentralen Logger landen sollen.
Doppelte Schlüssel im ersten Array
Eine subtile Stolperfalle entsteht, wenn das Schlüssel-Array Doppelungen enthält. PHP erlaubt in einem Array nur eindeutige Schlüssel, deshalb gewinnt der zuletzt eingetragene Wert. Früher übergebene Werte werden überschrieben.
<?php
$keys = ['rolle', 'rolle', 'rolle'];
$values = ['admin', 'editor', 'leser'];
$result = array_combine($keys, $values);
print_r($result);
/* Array ( [rolle] => leser ) */
Das Verhalten ist konsistent mit normalen Array-Zuweisungen, aber im Code-Review oft eine Quelle für falsche Annahmen. Wer doppelte Schlüssel zuverlässig vermeiden will, sollte die Daten vorab mit array_unique() bereinigen oder mit count(array_unique($keys)) === count($keys) validieren. Float-Schlüssel werden übrigens automatisch in Integer gecastet und Boolean-Schlüssel zu 0 oder 1, was im Sonderfall ebenfalls für Überraschungen sorgt.
Vergleich zu array_merge() und array_flip()
Im Code-Bestand großer Projekte tauchen drei verwandte Array-Funktionen auf, die oft verwechselt werden. PHP array_combine() verbindet zwei Arrays so, dass das erste die Schlüssel und das zweite die Werte liefert. array_merge() hängt Arrays aneinander, und array_flip() tauscht Schlüssel und Werte innerhalb eines einzelnen Arrays.
<?php
$keys = ['a', 'b', 'c'];
$values = [1, 2, 3];
print_r(array_combine($keys, $values));
/* Array ( [a] => 1 [b] => 2 [c] => 3 ) */
print_r(array_merge($keys, $values));
/* Array ( [0] => a [1] => b [2] => c [3] => 1 [4] => 2 [5] => 3 ) */
PHP array_combine() ist also keine Variante von array_merge(), sondern eine eigenständige Operation. Wer ein assoziatives Array bauen will, nimmt array_combine. Wer Werte aneinanderhängen oder zwei assoziative Arrays vereinen will, nimmt array_merge.
flowchart TD
A[Erstes Array: Keys] --> C{Laenge gleich?}
B[Zweites Array: Values] --> C
C -->|Ja| D[Reissverschluss zusammenfuehren]
C -->|Nein| E[ValueError werfen]
D --> F[Assoziatives Array]
Pipeline mit array_keys() und array_map()
Ein eleganter Anwendungsfall ist die gezielte Transformation der Werte eines bestehenden Arrays bei gleichzeitigem Erhalt der Schlüssel. array_keys() liefert die Schlüsselliste, array_map() transformiert die Werte, und PHP array_combine() setzt beide wieder zu einem assoziativen Array zusammen.
<?php
$preise = ['apfel' => 0.49, 'birne' => 0.79, 'kiwi' => 1.20];
$brutto = array_combine(
array_keys($preise),
array_map(fn($p) => round($p * 1.19, 2), $preise)
);
print_r($brutto);
/* Array ( [apfel] => 0.58 [birne] => 0.94 [kiwi] => 1.43 ) */
Diese Pipeline ist sehr ausdrucksstark und vermeidet eine handgeschriebene foreach-Schleife. Sie funktioniert besonders gut, wenn die Transformation der Werte als Closure ausdrückbar ist und die Schlüssel unverändert bleiben sollen.
Performance und Best Practices
PHP array_combine() ist intern in C implementiert und damit deutlich schneller als ein vergleichbares foreach im PHP-Userland. Bei Datensets mit zehntausenden Elementen lohnt sich der Aufruf besonders, weil er nur einmal die C-Schicht betritt und nicht pro Element. Trotzdem ist Performance selten der Hauptgrund für den Einsatz dieser Funktion. Lesbarkeit und Knappheit im Code sind die stärkeren Argumente.
Im Code-Review lohnt es sich, drei Punkte zu prüfen. Erstens, ob ein Längen-Check vor dem Aufruf vorhanden ist, wenn die Daten aus einer unsicheren Quelle stammen. Zweitens, ob das Schlüssel-Array Doppelungen enthalten kann, die unbemerkt Werte überschreiben. Drittens, ob ein einfaches array_keys() plus array_combine() nicht eigentlich nach array_map() ohne Zwischenschritt schreit. Wer diese Routineprüfung verinnerlicht, vermeidet die typischen Bugs in Junior-Code.
Fazit
PHP array_combine() ist eine kompakte und sehr nützliche Funktion, die zwei flache Arrays nach dem Reißverschluss-Prinzip zu einem assoziativen Array verbindet. Sie glänzt vor allem im CSV-Import, in Pipelines mit array_keys und array_map sowie überall dort, wo aus parallelen Listen ein lesbares Schlüssel-Wert-Paar werden soll. Wer den ValueError ab PHP 8 sauber abfängt und doppelte Schlüssel im Schlüssel-Array im Auge behält, kommt mit PHP array_combine() in der Praxis schnell und ohne handgeschriebene Schleifen ans Ziel.