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()quandonullsignifica "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()quandonullè un valore reale che devi distinguere da una chiave mancante: un campo JSON inviato comenull, una colonna del database che èNULL, un'opzione impostata esplicitamente anullper 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).