Aktueller Standort: Startseite> Neueste Artikel> Warum prüft Array_key_exists nicht, ob der Wert eines Array -Elements null ist?

Warum prüft Array_key_exists nicht, ob der Wert eines Array -Elements null ist?

gitbox 2025-05-28

Bei der Verwendung von PHP für Array -Operationen sind viele Entwickler durch die Funktion array_key_exists () verwirrt, insbesondere wenn der Schlüsselwert null ist, es wird immer noch true zurückgegeben. Der Grund dafür hängt tatsächlich eng mit dem Arbeitsmechanismus von PHP -Arrays zusammen.

Die Rolle von array_key_exists ()

Die Funktion von array_key_exists () besteht darin, festzustellen, ob der angegebene Schlüssel im Array vorhanden ist, anstatt festzustellen, ob der Schlüssel einen Wert hat . Dies bedeutet, dass, solange dieser Schlüssel im Array existiert, unabhängig von seinem entsprechenden Wert (auch wenn er null ist), die Funktion zurückgibt .

 $array = ['name' => null];

if (array_key_exists('name', $array)) {
    echo 'Der Schlüssel existiert';
} else {
    echo 'Der Schlüssel existiert nicht';
}

Die Ausgabe des obigen Codes ist:

 Der Schlüssel existiert

Dies liegt daran, dass der Schlüssel "Name" im Array existiert, obwohl sein Wert null ist.

Vergleich mit isset ()

Viele Anfänger verwechseln Array_key_exists () und isset () , und ihr Verhalten unterscheidet sich, wenn der Wert null ist.

 $array = ['name' => null];

var_dump(isset($array['name']));            // Ausgabe: bool(false)
var_dump(array_key_exists('name', $array)); // Ausgabe: bool(true)

ISSET () prüft, ob die Variable festgelegt ist und nicht null . Wenn also der Wert eines Schlüssels null ist, wird Isset () false zurückgeben, und Array_key_exists () kümmert sich nur darum, ob der Schlüssel existiert, unabhängig vom Wert.

Praktische Anwendungsszenarien

Dieser Verhaltensunterschied ist in Szenarien, in denen die Formdaten verarbeitet werden, API -Anfragen oder die Notwendigkeit, zwischen "Tasten nicht zu existieren", und "Tasten existieren, aber die Werte leer sind" zu unterscheiden. Zum Beispiel:

 // Simulation JSON Körperbefragung
$json = '{"username": null}';
$data = json_decode($json, true);

// Wenn der Benutzer explizit einreicht null Wert,array_key_exists Kann identifiziert werden
if (array_key_exists('username', $data)) {
    // bewältigen username,哪怕Wert为 null
} else {
    // username Feld nicht eingereicht
}

Wenn Sie ISSET () verwenden, um festzustellen, ob der Benutzername existiert, wissen Sie nicht, ob der Benutzer absichtlich in einem Nullwert bestanden hat, was bei einigen logischen Urteilen Unklarheiten verursacht.

Beispiel für Fehler: Verwenden Sie die ISSET, um die Existenz des Schlüssels zu bestimmen

Angenommen, Sie haben ein Konfigurationsarray:

 $config = ['debug' => null];

if (isset($config['debug'])) {
    echo 'Schalten Sie den Debug -Modus ein';
}

Dieses Urteil wird fehlschlagen, weil ISSET () false zurückgibt, wenn der Wert null ist. Tatsächlich möchten Sie jedoch nur wissen, ob dieser Schlüssel existiert. Ein genauerer Ansatz sollte sein:

 if (array_key_exists('debug', $config)) {
    echo 'Schalten Sie den Debug -Modus ein';
}

Sicherere Urteilslogik

Wenn Sie wissen möchten, ob der Schlüssel existiert, und auch den Inhalt des Wertes verarbeiten möchten, können Sie ihn in Kombination mit beiden verwenden:

 if (array_key_exists('token', $data)) {
    if ($data['token'] !== null) {
        // effizient token
        $token = $data['token'];
    } else {
        // token Ja null,Eine Überprüfung oder Aufforderung eines Fehlers kann erforderlich sein
    }
} else {
    // token Die Felder sind überhaupt nicht weitergegeben,可能Ja非法请求
}

Zusammenfassung

Das Verhalten von array_key_exists () wurde sehr vernünftig gestaltet: Es konzentriert sich auf die Existenz von Schlüssel, nicht auf den Wert der Werte. Dies zu verstehen ist wichtig, um robuste PHP -Programme zu schreiben.

Wenn Sie während des Debuggens tatsächlich weiter bestätigen müssen, ob ein Schlüssel tatsächlich im Array vorhanden ist, ist auch dann die richtige Wahl, wenn sein Wert null ist. Vermeiden Sie Missbrauch von ISSET () , um die Existenz von Schlüssel zu bestimmen. Andernfalls können Sie Schlüsselwerte ignorieren, die explizit auf NULL eingestellt werden, was besonders anfällig für Fehler ist, wenn sie sich mit komplexer Geschäftslogik befassen (z. B. das API -Design von gitbox.net ).