Menu

PHP array_key_exists(): prüfen, ob ein Schlüssel existiert

array_key_exists('key', $array) liefert true, wenn das Array diesen Schlüssel hat, selbst wenn sein Wert null ist. isset($array['key']) ist schneller, liefert bei einem null-Wert aber false. Hier: der Unterschied, key_exists(), verschachtelte Schlüssel, mehrere Schlüssel prüfen und warum Objekte property_exists() brauchen.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

array_key_exists('key', $array) liefert true, wenn das Array diesen Schlüssel hat, und false, wenn nicht. Beachte die Reihenfolge: zuerst der Schlüssel, dann das Array. Es liefert true, selbst wenn der unter dem Schlüssel gespeicherte Wert null ist, und genau das macht isset() nicht.

Um einen Wert statt eines Schlüssels zu prüfen, verwendest du in_array().

array_key_exists vs isset

Beide prüfen auf einen Schlüssel. Sie sind sich nur uneinig, wenn der Wert null ist: isset() behandelt einen null-Wert als „nicht gesetzt“, array_key_exists() meldet, was tatsächlich im Array steht.

0 und '' zählen für beide als gesetzt; nur null trennt sie. Welche du willst, hängt davon ab, was null in deinen Daten bedeutet:

  • Verwende isset(), wenn null „kein Wert“ bedeutet. Das ist der übliche Fall, es ist ein Sprachkonstrukt (etwas schneller) und akzeptiert verschachtelte Pfade und undefinierte Variablen ohne Warnung.
  • Verwende array_key_exists(), wenn null ein echter Wert ist, den du von einem fehlenden Schlüssel unterscheiden musst: ein JSON-Feld, das als null gesendet wurde, eine Datenbankspalte mit NULL, eine Option, die ausdrücklich auf null gesetzt wurde, um sie zu leeren.

Die Seite zu isset behandelt seine anderen Einsätze, etwa mehrere Variablen auf einmal zu prüfen.

null und fehlend in einem JSON-Payload unterscheiden

Ein typischer Fall, in dem nur array_key_exists() die richtige Antwort liefert: eine API, die einen Datensatz aus JSON aktualisiert. Ein Feld, das als null gesendet wird, bedeutet „leeren“, ein weggelassenes Feld bedeutet „nicht anfassen“. isset() sieht beides gleich.

Mit isset($patch[$field]) bliebe die Telefonnummer stehen, weil das null wie ein fehlendes Feld aussähe.

key_exists() ist dieselbe Funktion

key_exists() ist ein Alias von array_key_exists(), übrig aus frühem PHP. Gleiche Argumente, gleiches Ergebnis. Bevorzuge den vollen Namen, den Leser erwarten.

Schlüsseltypen: "1" und 1 sind derselbe Schlüssel

Array-Schlüssel sind Ganzzahlen oder Strings, und ein String, der eine einfache Dezimalzahl ist, wird als Ganzzahl gespeichert. Also findet array_key_exists('1', $arr) den Schlüssel 1, und umgekehrt. Ein String wie '01' bleibt ein String und ist ein anderer Schlüssel.

Verschachtelte und mehrere Schlüssel prüfen

array_key_exists() schaut auf eine Ebene. Für einen verschachtelten Pfad, bei dem null egal ist, prüft isset($a['x']['y']) jede Ebene auf einmal. Für einen Pfad, bei dem es nicht egal ist, geht eine kleine Hilfsfunktion die Ebenen ab. Um zu prüfen, dass mehrere Schlüssel alle vorhanden sind, vergleichst du mit array_diff_key().

array_flip($required) macht aus der Liste der Namen Schlüssel, damit array_diff_key() sie mit den Schlüsseln der Eingabe vergleichen kann; was übrig bleibt, ist die Liste der fehlenden Felder, fertig für eine Fehlermeldung.

Objekte brauchen property_exists

Ältere PHP-Versionen akzeptierten ein Objekt in array_key_exists(). PHP 8 wirft stattdessen einen TypeError. Bei Objekten prüft property_exists() auf eine deklarierte oder dynamische Eigenschaft (auch eine, die auf null gesetzt ist), und isset($obj->prop) funktioniert wie isset() bei Arrays.

Die letzten zwei Zeilen zeigen den anderen Weg: get_object_vars() macht aus den zugänglichen Eigenschaften des Objekts ein Array, und dann gelten die Array-Funktionen.

Häufig gestellte Fragen

Warum liefert isset false, wenn array_key_exists true liefert?

Der Schlüssel enthält null. isset($arr['k']) ist nur true, wenn der Schlüssel existiert und sein Wert nicht null ist, während array_key_exists('k', $arr) immer true ist, sobald der Schlüssel im Array steht. Bei jedem anderen Wert, auch 0, '' und false, liefern beide dieselbe Antwort.

Was ist key_exists in PHP?

Ein Alias von array_key_exists(). key_exists('id', $row) und array_key_exists('id', $row) verhalten sich gleich. Die meisten verwenden den längeren Namen.

Wie prüfe ich in PHP, ob ein verschachtelter Schlüssel existiert?

Prüfe jede Ebene: isset($data['user']['address']['city']) prüft den ganzen Pfad auf einmal und warnt nie, wenn eine Ebene fehlt. Wenn null-Werte als vorhanden zählen müssen, gehst du den Pfad Ebene für Ebene mit array_key_exists() ab.

Kann ich array_key_exists auf ein Objekt anwenden?

Nein. Seit PHP 8.0 wirft die Übergabe eines Objekts einen TypeError. Verwende property_exists($obj, 'name') für deklarierte Eigenschaften oder isset($obj->name).

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S