Guida completa alla funzione array_uintersect() di PHP
Scopri come array_uintersect() in PHP confronta array con una callback personalizzata per restituire valori comuni. Sintassi, esempi e casi d'uso.
La funzione array_uintersect() confronta i valori di due o più array e restituisce i valori del primo array presenti anche in tutti gli altri. La differenza rispetto a array_intersect() sta nel prefisso u: tu fornisci la logica di confronto come callback, decidendo esattamente quando due valori sono da considerare uguali.
Questa pagina illustra la sintassi, il funzionamento della callback di confronto, esempi eseguibili e quando conviene usare questa funzione rispetto alle sue alternative più semplici.
Sintassi
array_uintersect(
array $array1,
array $array2,
array ...$arrays,
callable $value_compare_func
): array| Parametro | Descrizione |
|---|---|
$array1 | L'array di base. Le sue chiavi e i suoi valori vengono preservati nel risultato. |
$array2, ...$arrays | Uno o più array con cui confrontare. Un valore sopravvive solo se è presente in tutti gli altri. |
$value_compare_func | Una callback che stabilisce quando due valori sono uguali. È sempre l'ultimo argomento. |
La funzione restituisce un nuovo array con i valori di $array1 trovati in tutti gli altri array, mantenendo intatte le chiavi originali di $array1.
Come funziona la callback di confronto
La callback riceve due valori e deve restituire un intero:
- un valore minore di 0 se il primo argomento è "minore" del secondo,
- 0 se i due valori sono considerati uguali,
- un valore maggiore di 0 se il primo è "maggiore" del secondo.
Solo un valore restituito pari a 0 viene considerato una corrispondenza. Questo è lo stesso contratto a tre vie usato dalle funzioni di ordinamento come usort(), motivo per cui la funzione built-in strcmp() è una comoda callback per le string.
array_uintersect() non esegue alcuna coercizione di tipo propria — ogni decisione sull'uguaglianza passa attraverso la tua callback. Ciò significa che puoi rendere il confronto libero o rigoroso quanto necessario (case-insensitive, type-strict, object-aware e così via).
Una semplice callback per string si presenta così:
function compare_strings($string1, $string2) {
return strcmp($string1, $string2);
}Esempio di base
Qui intersechiamo tre array di nomi di frutta usando la callback sopra:
<?php
function compare_strings($string1, $string2) {
return strcmp($string1, $string2);
}
$array1 = array("apple", "orange", "banana");
$array2 = array("orange", "banana", "kiwi");
$array3 = array("banana", "kiwi", "grape");
$result = array_uintersect($array1, $array2, $array3, "compare_strings");
print_r($result);
?>Output:
Array
(
[2] => banana
)Solo "banana" compare in tutti e tre gli array. Nota che la chiave è 2 — si tratta dell'indice originale in $array1, preservato nel risultato. "orange" viene escluso perché manca in $array3.
Confronto case-insensitive
Poiché la callback gestisce tutta la logica di confronto, sostituire strcasecmp() fa sì che l'intersezione ignori le maiuscole e minuscole:
<?php
$a = ["Red", "GREEN", "Blue"];
$b = ["red", "green", "yellow"];
$result = array_uintersect($a, $b, "strcasecmp");
print_r($result);
?>Output:
Array
(
[0] => Red
[1] => GREEN
)"Red" e "GREEN" vengono mantenuti perché strcasecmp() li tratta come uguali a "red" e "green". I valori restituiti sono quelli del primo array, quindi la capitalizzazione originale viene preservata.
Quando usare array_uintersect()
Usa questa funzione quando:
- Hai bisogno dell'intersezione dei valori degli array (non delle chiavi), e
- Un semplice controllo di uguaglianza non è sufficiente — i valori sono object, tipi misti o richiedono una corrispondenza fuzzy/normalizzata.
Se devi solo confrontare valori con il confronto libero predefinito di PHP, array_intersect() è più semplice. Se anche le chiavi contano, vedi array_uintersect_assoc(), e per la differenza (anziché l'intersezione) con una callback, vedi array_udiff().
Vantaggi principali:
- Trova elementi comuni in molti array con una sola chiamata, senza cicli manuali.
- Le chiavi originali del primo array vengono preservate per una mappatura dei dati più semplice.
- La logica di confronto personalizzata gestisce tipi di dati complessi e regole di corrispondenza specifiche.
Conclusione
array_uintersect() è lo strumento giusto quando hai bisogno dei valori comuni di più array ma il confronto built-in di PHP non corrisponde al modo in cui tu definisci l'uguaglianza. Definisci una callback che restituisce 0 per i valori uguali, passala come ultimo argomento e la funzione restituirà i valori corrispondenti dal primo array con le loro chiavi intatte.