Menu

PHP array_key_exists(): verificare se una chiave esiste

array_key_exists('key', $array) restituisce true quando l'array ha quella chiave, anche se il suo valore è null. isset($array['key']) è più veloce ma restituisce false per un valore null. Impara la differenza, key_exists(), le chiavi annidate, il controllo di più chiavi e perché gli oggetti richiedono property_exists().

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

array_key_exists('key', $array) restituisce true se l'array ha quella chiave e false se non ce l'ha. Nota l'ordine: prima la chiave, poi l'array. Restituisce true anche quando il valore salvato sotto la chiave è null, l'unica cosa che isset() non fa.

Per verificare un valore invece di una chiave, usa in_array().

array_key_exists vs isset

Entrambe verificano una chiave. Non sono d'accordo solo quando il valore è null: isset() tratta un valore null come "non impostato", array_key_exists() riporta ciò che c'è davvero nell'array.

0 e '' contano come impostati per entrambe; solo null le divide. Quale ti serve dipende da cosa significa null nei tuoi dati:

  • Usa isset() quando null significa "nessun valore". È il caso comune, è un costrutto del linguaggio (un po' più veloce) e accetta percorsi annidati e variabili non definite senza warning.
  • Usa array_key_exists() quando null è un valore reale che devi distinguere da una chiave mancante: un campo JSON inviato come null, una colonna del database che è NULL, un'opzione impostata esplicitamente a null per azzerarla.

La pagina su isset tratta i suoi altri usi, compreso il controllo di più variabili insieme.

Distinguere null da mancante in un payload JSON

Un caso tipico in cui solo array_key_exists() dà la risposta giusta: un'API che aggiorna un record da un JSON. Un campo inviato come null significa "azzeralo", un campo omesso significa "non toccarlo". isset() li vede come la stessa cosa.

Con isset($patch[$field]) il numero di telefono resterebbe, perché il null sembrerebbe un campo mancante.

key_exists() è la stessa funzione

key_exists() è un alias di array_key_exists(), rimasto dalle prime versioni di PHP. Stessi argomenti, stesso risultato. Preferisci il nome completo, che è quello che chi legge si aspetta.

Tipi di chiave: "1" e 1 sono la stessa chiave

Le chiavi degli array sono interi o stringhe, e una stringa che è un semplice intero decimale viene memorizzata come intero. Quindi array_key_exists('1', $arr) trova la chiave 1, e viceversa. Una stringa come '01' resta una stringa ed è una chiave diversa.

Verificare chiavi annidate e più chiavi

array_key_exists() guarda un solo livello. Per un percorso annidato in cui null non conta, isset($a['x']['y']) verifica ogni livello in una volta. Per un percorso in cui conta, una piccola funzione di supporto percorre i livelli. Per verificare che più chiavi siano tutte presenti, confronta con array_diff_key().

array_flip($required) trasforma la lista di nomi in chiavi così array_diff_key() può confrontarle con le chiavi dell'input; ciò che avanza è la lista dei campi mancanti, pronta per un messaggio di errore.

Gli oggetti richiedono property_exists

Le vecchie versioni di PHP accettavano un oggetto in array_key_exists(). PHP 8 lancia invece un TypeError. Per gli oggetti, property_exists() verifica una proprietà dichiarata o dinamica (anche se impostata a null), e isset($obj->prop) funziona come isset() sugli array.

Le ultime due righe mostrano l'altra strada: get_object_vars() trasforma le proprietà accessibili dell'oggetto in un array, e a quel punto si applicano le funzioni per array.

Domande frequenti

Perché isset restituisce false quando array_key_exists restituisce true?

La chiave contiene null. isset($arr['k']) è true solo se la chiave esiste e il suo valore non è null, mentre array_key_exists('k', $arr) è true ogni volta che la chiave è nell'array. Per qualsiasi altro valore, compresi 0, '' e false, entrambe danno la stessa risposta.

Cos'è key_exists in PHP?

Un alias di array_key_exists(). key_exists('id', $row) e array_key_exists('id', $row) si comportano allo stesso modo. La maggior parte del codice usa il nome più lungo.

Come verifico se una chiave annidata esiste in PHP?

Verifica ogni livello: isset($data['user']['address']['city']) controlla l'intero percorso in una volta e non genera mai warning quando manca un livello. Se i valori null devono contare come presenti, percorri il cammino con array_key_exists() livello per livello.

Posso usare array_key_exists su un oggetto?

No. Da PHP 8.0 passare un oggetto lancia un TypeError. Usa property_exists($obj, 'name') per le proprietà dichiarate, oppure isset($obj->name).

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA