Guida Completa alla Funzione PHP array_uintersect_assoc
Scopri come PHP array_uintersect_assoc() calcola l'intersezione di array con verifica degli indici e una callback personalizzata per i valori.
array_uintersect_assoc() calcola l'intersezione di due o più array con un controllo aggiuntivo sugli indici, dove i valori vengono confrontati tramite una callback fornita dall'utente mentre le chiavi vengono confrontate con il confronto interno (loose). Restituisce le voci del primo array la cui chiave e il cui valore compaiono in tutti gli altri array.
La "u" nel nome indica confronto dei valori definito dall'utente; il suffisso _assoc significa le chiavi vengono controllate anch'esse. Quindi un elemento sopravvive solo se entrambe queste condizioni sono vere:
- la sua chiave esiste in tutti gli altri array (confrontata con il confronto standard di PHP), e
- la tua callback considera il suo valore uguale all'elemento corrispondente in ogni altro array.
Questo la rende la versione rigorosa di array_intersect(), che ignora le chiavi e usa il confronto per stringa. Usa array_uintersect_assoc() quando la corrispondenza delle chiavi è importante e hai bisogno di un confronto dei valori personalizzato — ad esempio confronto case-insensitive, confronto di oggetti, o corrispondenza di numeri con una tolleranza.
Sintassi
array_uintersect_assoc(array $array1, array $array2, ...$arrays, callable $value_compare_func): arrayLa callback è sempre l'ultimo argomento. Tutto ciò che la precede è un array da intersecare.
Parametri
| Parametro | Descrizione |
|---|---|
$array1 | L'array base. Chiavi e valori di questo array vengono preservati nel risultato. |
$array2, ... | Uno o più array da confrontare con $array1. |
$value_compare_func | Una callback che confronta due valori e restituisce un intero. |
Valore restituito
Un array associativo contenente ogni voce di $array1 la cui chiave è presente in tutti gli altri array e il cui valore la callback considera uguale in tutti. Le chiavi vengono preservate da $array1.
La funzione callback
La callback riceve due valori e deve restituire un intero che li ordina, esattamente come le funzioni di confronto usate da usort():
0quando i due valori sono considerati uguali,- un numero negativo (
< 0) quando il primo è "minore" del secondo, - un numero positivo (
> 0) quando il primo è "maggiore" del secondo.
Due valori vengono trattati come corrispondenti solo quando la callback restituisce 0. Funzioni integrate come strcasecmp() (confronto di stringhe case-insensitive) e strcmp() seguono già questo contratto, motivo per cui possono essere passate direttamente.
Esempi
Esempio 1: Intersezione di base su tre array
Output:
Array
(
[c] => cherry
)Solo c => cherry sopravvive. apple è in $array1 e $array3 ma manca da $array2; banana è in $array1 e $array2 ma manca da $array3. Solo cherry compare sotto la stessa chiave c in tutti e tre gli array, quindi è l'unica corrispondenza. Nota che la chiave c viene preservata da $array1.
Esempio 2: Corrispondenza dei valori case-insensitive
Output:
Array
(
[c] => Cherry
)I valori differiscono per maiuscole/minuscole tra gli array (Cherry vs cherry), ma poiché strcasecmp confronta senza distinguere tra maiuscole e minuscole, la callback li considera comunque uguali. Il risultato mantiene il valore così come appare in $array1 (Cherry).
Esempio 3: Perché il controllo degli indici è importante
La parte "assoc" è più facile da vedere quando lo stesso valore si trova sotto chiavi diverse:
<?php
$array1 = array('x' => 'red', 'y' => 'green', 'z' => 'blue');
$array2 = array('x' => 'red', 'w' => 'green', 'z' => 'BLUE');
$result = array_uintersect_assoc($array1, $array2, "strcasecmp");
print_r($result);
?>Output:
Array
(
[x] => red
[z] => blue
)red corrisponde perché condivide la chiave x in entrambi gli array. blue/BLUE corrisponde perché condividono la chiave z e strcasecmp ignora le maiuscole. Ma green viene escluso: si trova sotto la chiave y nel primo array e sotto la chiave w nel secondo, quindi le chiavi non coincidono. Se usassi il semplice array_uintersect(), green verrebbe incluso perché le chiavi verrebbero ignorate.
Funzioni correlate
array_intersect()— intersezione per valore, usando il confronto per stringa.array_intersect_assoc()— intersezione per chiave e valore, usando il confronto per stringa (senza callback).array_uintersect()— intersezione per valore con una callback, ignorando le chiavi.array_uintersect_uassoc()— come questa funzione, ma le chiavi vengono confrontate anche con una seconda callback.
Conclusione
array_uintersect_assoc() mantiene le voci del primo array la cui chiave compare in tutti gli altri array e il cui valore la callback considera uguale in tutti. Usala quando le chiavi sono significative e la corrispondenza dei valori richiede una logica personalizzata. Se hai bisogno anche di controllare come vengono confrontate le chiavi, usa array_uintersect_uassoc(); se il confronto per stringa dei valori è sufficiente, il più semplice array_intersect_assoc() fa al caso tuo.