W3docs

La funzione PHP array_uintersect_uassoc

Scopri come usare array_uintersect_uassoc in PHP per calcolare intersezioni di array con callback personalizzate per valori e chiavi.

PHP è un linguaggio potente con numerose funzioni, e array_uintersect_uassoc è una delle funzioni più versatili della libreria di funzioni per array di PHP. Questa funzione consente di calcolare l'intersezione di array con funzioni di confronto delle chiavi definite dall'utente.

Se stai cercando un modo per confrontare due array e ottenere i valori presenti in tutti, la funzione array_uintersect_uassoc è ciò di cui hai bisogno. Questa funzione offre la flessibilità di confrontare array con funzioni di confronto personalizzate, rendendola uno strumento prezioso per qualsiasi sviluppatore PHP.

Ecco una panoramica dettagliata della funzione array_uintersect_uassoc, con alcuni esempi per aiutarti a capire come funziona.

Cos'è la funzione array_uintersect_uassoc?

La funzione array_uintersect_uassoc è una funzione built-in di PHP utilizzata per calcolare l'intersezione di array tramite funzioni di confronto definite dall'utente per i dati e le chiavi. Questa funzione confronta i valori di due array e restituisce i valori presenti in tutti, a patto che anche le loro chiavi corrispondano secondo la funzione di confronto delle chiavi.

Una delle caratteristiche principali della funzione array_uintersect_uassoc è la sua capacità di confrontare array usando funzioni di confronto di chiavi e valori definite dall'utente. Ciò significa che puoi personalizzare la logica di confronto in base alle tue esigenze specifiche.

Come usare la funzione array_uintersect_uassoc

La funzione array_uintersect_uassoc accetta due o più array seguiti da due callback — l'ultimo argomento è sempre la callback di confronto delle chiavi, mentre quella precedente è la callback di confronto dei valori. Ecco la sintassi:

Sintassi della funzione PHP array_uintersect_uassoc

array_uintersect_uassoc(
    array $array1,
    array $array2,
    array ...$arrays,
    callable $value_compare_func,
    callable $key_compare_func
): array

Parametri:

  • array1: L'array di base. I valori che superano il confronto vengono presi da qui, con le loro chiavi originali conservate.
  • array2, ...$arrays: Uno o più array da confrontare con array1.
  • value_compare_func: Una callback per confrontare i valori. Riceve due valori e deve restituire un intero minore di, uguale a, o maggiore di 0 — esattamente come un comparatore di ordinamento. Restituire 0 significa "uguali".
  • key_compare_func: Una callback per confrontare le chiavi, con lo stesso contratto di restituzione a tre vie.

Valore restituito: Restituisce un array contenente ogni elemento di array1 il cui valore e la cui chiave corrispondono entrambi a un elemento in ciascuno degli altri array. Un elemento sopravvive solo quando entrambe le callback restituiscono 0 rispetto a qualche elemento in ogni altro array.

Poiché entrambe le callback seguono il contratto standard <=> (spaceship), restituire 1 o -1 indica semplicemente a PHP che gli elementi non sono uguali — solo 0 conta come corrispondenza.

Vediamo un esempio di utilizzo della funzione array_uintersect_uassoc per confrontare due array:

PHP: usare la funzione array_uintersect_uassoc per confrontare due array

<?php

function compare_data($a, $b)
{
    if ($a === $b) {
        return 0;
    }
    return ($a > $b) ? 1 : -1;
}

function compare_keys($a, $b)
{
    if ($a === $b) {
        return 0;
    }
    return ($a > $b) ? 1 : -1;
}

$array1 = ["a" => "green", "b" => "brown", "c" => "blue", "d" => "red"];
$array2 = ["a" => "green", "b" => "yellow", "blue", "d" => "red"];

$result = array_uintersect_uassoc($array1, $array2, "compare_data", "compare_keys");
print_r($result);

?>

Nell'esempio precedente, definiamo innanzitutto due funzioni di confronto personalizzate per i dati e le chiavi, quindi definiamo due array che vogliamo confrontare. Chiamiamo poi la funzione array_uintersect_uassoc con i due array e le due funzioni di confronto come argomenti.

La funzione array_uintersect_uassoc restituisce un array contenente i valori presenti in entrambi gli array. In questo esempio, il risultato sarà:

Array
(
    [a] => green
    [d] => red
)

Perché solo a e d? Un elemento sopravvive solo quando sia la sua chiave che il suo valore corrispondono.

  • [a] => green corrisponde: la chiave a e il valore green esistono in entrambi gli array. Mantenuto.
  • [b] => brown viene eliminato: la chiave b esiste in entrambi, ma i valori (brown vs yellow) differiscono.
  • [c] => blue viene eliminato: array1 ha questo elemento sotto la chiave c, ma array2 archivia blue sotto la chiave numerica auto-assegnata 0, quindi le chiavi non corrispondono.
  • [d] => red corrisponde: la chiave d e il valore red esistono in entrambi. Mantenuto.

Quest'ultimo caso è esattamente ciò che distingue questa funzione dall'intersezione basata solo sui valori: anche quando un valore è presente in entrambi gli array, una chiave non corrispondente lo elimina.

Nota: L'esempio usa funzioni con nome per una compatibilità più ampia, ma PHP moderno (7.4+) supporta le concise arrow function (es. fn($a, $b) => $a <=> $b). Scegli la sintassi più adatta ai requisiti di versione PHP del tuo progetto.

Quando usare questa funzione

Usa array_uintersect_uassoc quando si verificano tutte e tre le condizioni: hai bisogno di un'intersezione, le chiavi sono significative (dati associativi) e valori o chiavi richiedono una logica di confronto personalizzata (stringhe case-insensitive, oggetti, ordinamento locale, tolleranza sui float, ecc.). Se hai bisogno solo di una di queste condizioni, un'alternativa più semplice è la scelta migliore:

Consulta il capitolo PHP Arrays per una panoramica più ampia sul lavoro con gli array.

Un esempio reale: corrispondenza case-insensitive

Il primo esempio ha usato comparatori rigorosi, quindi si comporta come il built-in array_intersect_assoc. La vera potenza emerge quando le callback fanno qualcosa che i built-in non possono fare — qui, abbinando chiavi e valori indipendentemente dalle maiuscole:

<?php

$inventory = ["Apple" => "RED", "Banana" => "yellow", "Cherry" => "dark-red"];
$catalog   = ["apple" => "red", "banana" => "GREEN", "cherry" => "DARK-RED"];

$result = array_uintersect_uassoc(
    $inventory,
    $catalog,
    fn($a, $b) => strcasecmp($a, $b), // compare values, ignoring case
    fn($a, $b) => strcasecmp($a, $b)  // compare keys, ignoring case
);

print_r($result);

?>

strcasecmp restituisce 0 quando due stringhe sono uguali ignorando le maiuscole, quindi si adatta perfettamente al contratto del comparatore. Il risultato mantiene gli elementi di $inventory la cui chiave e il cui valore corrispondono a $catalog in modo case-insensitive:

Array
(
    [Apple] => RED
    [Cherry] => dark-red
)

Banana viene escluso perché, sebbene le chiavi corrispondano, i valori (yellow vs GREEN) differiscono anche ignorando le maiuscole. Un semplice array_intersect_assoc non avrebbe trovato nessuna corrispondenza, perché il suo confronto built-in è case-sensitive.

Vantaggi dell'uso della funzione array_uintersect_uassoc

Ci sono diversi vantaggi nell'usare la funzione array_uintersect_uassoc nei tuoi progetti PHP. Ecco alcuni dei principali vantaggi:

1. Corrispondenza precisa chiave-valore

A differenza di array_uintersect, questa funzione garantisce che vengano restituiti solo gli elementi con chiavi e valori corrispondenti. Questo previene i falsi positivi quando si confrontano array associativi in cui le chiavi hanno un significato semantico.

2. Logica di confronto personalizzata

Puoi definire regole di uguaglianza precise sia per i valori che per le chiavi, gestendo tipi di dati complessi o requisiti di ordinamento personalizzati che gli operatori built-in non possono coprire.

3. Prestazioni native

Implementata in C nel core di PHP, viene eseguita in modo efficiente per operazioni standard sugli array senza dipendenze esterne, rendendola adatta a dataset di dimensioni moderate.

Consigli per usare la funzione array_uintersect_uassoc

Ecco alcuni consigli per utilizzare la funzione array_uintersect_uassoc nei tuoi progetti PHP:

1. Definisci funzioni di confronto personalizzate

Per sfruttare al meglio la funzione array_uintersect_uassoc, è essenziale definire funzioni di confronto personalizzate. Questo ti permetterà di adattare la logica di confronto alle esigenze specifiche del tuo progetto.

2. Usa confronti type-safe

Quando definisci le tue funzioni di confronto personalizzate, è importante usare operatori di confronto type-safe. Questo garantirà che il confronto venga effettuato sui tipi di dati corretti, migliorando l'accuratezza dei risultati.

3. Testa le tue funzioni di confronto

Prima di utilizzare le tue funzioni di confronto personalizzate in produzione, è importante testarle accuratamente. Questo ti aiuterà a identificare eventuali bug o problemi e a garantire che la logica di confronto funzioni correttamente.

Conclusione

In questo articolo abbiamo esplorato la funzione array_uintersect_uassoc in PHP. Questa funzione è uno strumento potente per confrontare array e trovare i valori presenti in tutti. Utilizzando funzioni di confronto personalizzate per i dati e le chiavi, puoi adattare la logica di confronto alle esigenze specifiche del tuo progetto.

Se vuoi portare le tue competenze PHP al livello successivo, padroneggiare la funzione array_uintersect_uassoc è un ottimo punto di partenza. Con la sua flessibilità e versatilità, questa funzione è uno strumento indispensabile per qualsiasi sviluppatore PHP.

Grazie per aver letto la nostra guida alla funzione array_uintersect_uassoc. Speriamo che tu l'abbia trovata utile e informativa. Per domande o feedback, non esitare a contattarci.

Esercizio

Pratica
Qual è lo scopo della funzione array_uintersect_uassoc in PHP?
Qual è lo scopo della funzione array_uintersect_uassoc in PHP?
Was this page helpful?