W3docs

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
ParametroDescrizione
$array1L'array di base. Le sue chiavi e i suoi valori vengono preservati nel risultato.
$array2, ...$arraysUno o più array con cui confrontare. Un valore sopravvive solo se è presente in tutti gli altri.
$value_compare_funcUna 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:

  1. Trova elementi comuni in molti array con una sola chiamata, senza cicli manuali.
  2. Le chiavi originali del primo array vengono preservate per una mappatura dei dati più semplice.
  3. 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.

Esercitazione

Pratica
Qual è il ruolo della funzione array_uintersect() in PHP?
Qual è il ruolo della funzione array_uintersect() in PHP?
Was this page helpful?