Comprendere la funzione PHP: array_intersect_key()
La funzione PHP array_intersect_key() confronta array per chiave e restituisce solo le voci con chiavi corrispondenti. Scopri come funziona in questo articolo.
La funzione PHP array_intersect_key() confronta due o più array per le loro chiavi e restituisce un nuovo array contenente le voci del primo array le cui chiavi sono presenti in tutti gli altri array. In modo fondamentale, ignora completamente i valori — solo le chiavi determinano cosa viene mantenuto, e i valori restituiti sono sempre quelli del primo array. Questa pagina illustra come funziona la funzione, quando utilizzarla e le insidie più comuni.
Scopo
array_intersect_key() risponde alla domanda: "Quali voci di questo array compaiono — per chiave — in tutti questi altri array?" Un uso pratico molto comune è la whitelist degli input di un form o della configurazione: si mantengono solo le chiavi esplicitamente consentite e si scarta tutto il resto in un'unica chiamata.
Appartiene alla stessa famiglia di array_intersect(), che confronta per valore, e di array_diff_key(), che restituisce le chiavi assenti negli altri array.
Sintassi
array_intersect_key(array $array, array ...$arrays): array| Parametro | Descrizione |
|---|---|
$array | L'array da cui mantenere le voci. Le sue chiavi vengono verificate rispetto a ogni altro array, e i suoi valori sono quelli restituiti. |
$arrays | Uno o più array le cui chiavi vengono confrontate con $array. I loro valori non vengono mai utilizzati. |
Una voce sopravvive solo se la sua chiave è presente in tutti gli array forniti. Le coppie chiave/valore originali del primo array vengono preservate nel risultato.
Esempi
Confronto di due array
Le chiavi condivise da entrambi gli array sono a e b, quindi quelle voci vengono mantenute. Si noti che i valori differiscono per la chiave b (brown vs yellow) — questo non ha importanza, deve corrispondere solo la chiave, e il valore proviene da $array1. L'elemento "red" senza chiave esplicita in $array1 ottiene la chiave numerica implicita 0, assente in $array2, quindi viene scartato:
Array
(
[a] => green
[b] => brown
)Confronto di tre array
Quando si passano più di due array, una chiave deve essere presente in ogni array per sopravvivere.
Solo la chiave a è presente in tutti e tre gli array. La chiave b è assente in $array3 e la chiave c è assente in $array2, quindi entrambe vengono scartate:
Array
(
[a] => green
)Whitelist di un array per chiavi
L'uso più pratico di array_intersect_key() è filtrare un array associativo riducendolo a un insieme approvato di chiavi — ad esempio, accettare solo campi noti dall'input dell'utente:
<?php
$input = array(
"name" => "Ann",
"email" => "[email protected]",
"is_admin" => true, // attacker-supplied field we must ignore
);
$allowed = array("name" => "", "email" => "");
$safe = array_intersect_key($input, $allowed);
print_r($safe);
?>I valori di $allowed sono irrilevanti — funge puramente da elenco di chiavi permesse. Il pericoloso campo is_admin viene rimosso:
Array
(
[name] => Ann
[email] => [email protected]
)Cose da tenere a mente
- Vengono confrontate solo le chiavi, mai i valori. Due voci con la stessa chiave ma valori diversi corrispondono comunque. I valori restituiti provengono sempre dal primo array.
- L'ordine degli array non cambia quali chiavi sopravvivono, ma l'ordine delle voci nel risultato segue il primo array.
- Il confronto delle chiavi è case-sensitive per le chiavi string:
"A"e"a"sono chiavi diverse. - Le chiavi numeriche vengono confrontate come interi. La chiave string
"1"e la chiave intera1sono trattate come la stessa chiave, perché PHP normalizza le chiavi array numeriche-stringa in interi. - Passare un singolo array restituisce semplicemente quell'array invariato; passare un argomento non-array genera un
TypeError.
Funzioni correlate
array_intersect()— intersezione per valore invece che per chiave.array_intersect_assoc()— corrisponde sia alla chiave che al valore.array_diff_key()— l'inverso: mantiene le voci le cui chiavi non sono presenti negli altri array.array_key_exists()— verifica la presenza di una singola chiave.- Lavorare con gli array PHP — il riferimento completo sugli array.