W3docs

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
ParametroDescrizione
$arrayL'array da cui mantenere le voci. Le sue chiavi vengono verificate rispetto a ogni altro array, e i suoi valori sono quelli restituiti.
$arraysUno 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

php— editable, runs on the server

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.

php— editable, runs on the server

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 intera 1 sono 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

Pratica

Pratica
Cosa fa la funzione array_intersect_key() in PHP?
Cosa fa la funzione array_intersect_key() in PHP?
Was this page helpful?