Start · Sprachen · PHP · Referenz · array_diff_assoc

array_diff_assoc

Funktion

Berechnet den Unterschied zweier oder mehrerer Arrays unter Berücksichtigung von Schlüsseln <em>und</em> Werten.

seit PHP 4.3.0 Kategorie: array

Signatur

array_diff_assoc(array $array, array ...$arrays): array

Beschreibung

array_diff_assoc() vergleicht das erste Array mit einem oder mehreren weiteren Arrays und gibt alle Einträge zurück, die im ersten Array vorhanden sind, aber in keinem der anderen Arrays mit identischem Schlüssel-Wert-Paar vorkommen. Damit unterscheidet sich die Funktion von array_diff(), die nur die Werte vergleicht und Schlüssel ignoriert.

Die Vergleiche werden als lose Typvergleiche (==) für Werte und als strikte Schlüsselvergleiche durchgeführt. Ein Eintrag wird im Ergebnis beibehalten, wenn entweder sein Schlüssel im Vergleichs-Array nicht existiert oder der zugehörige Wert sich unterscheidet.

Typische Anwendungsfälle sind das Erkennen von Änderungen in assoziativen Datensätzen, z. B. beim Vergleich einer gespeicherten Konfiguration mit einer neuen Version, oder beim Ermitteln, welche Felder eines Formulars sich seit dem letzten Speichervorgang verändert haben.

Die Schlüssel werden im Rückgabe-Array beibehalten. Numerisch indizierte Arrays funktionieren ebenfalls, wobei dann auch die numerischen Indizes in den Vergleich einfließen.

Parameter

Name Typ Default Beschreibung
$array Pflicht array Das Ausgangs-Array, dessen Einträge auf Unterschiede geprüft werden.
$arrays Pflicht array Ein oder mehrere Vergleichs-Arrays. Alle Schlüssel-Wert-Paare des Ausgangs-Arrays werden gegen diese Arrays geprüft.

Rückgabewert

Typ
array
Beschreibung
Gibt ein Array zurück, das alle Schlüssel-Wert-Paare aus dem ersten Array enthält, die in keinem der Vergleichs-Arrays in exakt derselben Kombination (gleicher Schlüssel und gleicher Wert) vorkommen. Die Original-Schlüssel bleiben erhalten.

Beispiele

Einfacher assoziativer Vergleich

<?php
$config_alt = [
    'host'     => 'localhost',
    'port'     => 3306,
    'charset'  => 'utf8',
    'debug'    => false,
];

$config_neu = [
    'host'     => 'localhost',
    'port'     => 5432,
    'charset'  => 'utf8mb4',
    'debug'    => false,
];

$geaendert = array_diff_assoc($config_neu, $config_alt);
print_r($geaendert);
Array ( [port] => 5432 [charset] => utf8mb4 )

Unterschied bei numerischen Indizes

<?php
// Numerische Arrays: Indizes werden ebenfalls verglichen
$a = [0 => 'Apfel', 1 => 'Banane', 2 => 'Kirsche'];
$b = [0 => 'Apfel', 1 => 'Mango',  2 => 'Kirsche'];

$diff = array_diff_assoc($a, $b);
print_r($diff);
// Nur Index 1 unterscheidet sich im Wert
Array ( [1] => Banane )

Vergleich mit mehreren Arrays

<?php
$original  = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
$version1  = ['a' => 1, 'b' => 9, 'c' => 3];
$version2  = ['d' => 4, 'e' => 5];

// Einträge, die weder in $version1 noch in $version2 mit gleichem Schlüssel+Wert stehen
$diff = array_diff_assoc($original, $version1, $version2);
print_r($diff);
Array ( [b] => 2 )

// Wichtig · Fallstricke

Typvergleich: Werte werden mit dem nicht-strikten ==-Operator verglichen, Schlüssel hingegen typgenau. Das bedeutet, dass 0 und false als Werte als gleich gelten können. Wenn striktes Verhalten benötigt wird, sollte eine eigene Vergleichsfunktion mit array_diff_uassoc() implementiert werden.

Richtung beachten: Die Funktion ist nicht symmetrisch — array_diff_assoc($a, $b) liefert andere Ergebnisse als array_diff_assoc($b, $a). Für einen vollständigen bidirektionalen Vergleich müssen beide Richtungen ausgewertet werden.

Große Arrays: Bei sehr großen Arrays kann der Vergleich ressourcenintensiv sein, da jedes Schlüssel-Wert-Paar des ersten Arrays gegen alle Vergleichs-Arrays geprüft wird.