Confrontare e sincronizzare gli array in PHP con <strong>array_diff</strong> e <strong>array_intersect</str

by theArchitect
SHARE
Confrontare e sincronizzare gli array in PHP con <strong>array_diff</strong> e <strong>array_intersect</str
© Guida-HTML5.it

Introduzione

Quando si lavora con PHP è frequente dover confrontare due insiemi di dati. Per esempio, un’applicazione può ricevere l’elenco dei permessi richiesti da un utente e confrontarlo con quelli effettivamente assegnati. Oppure può essere necessario capire quali prodotti sono stati aggiunti o rimossi da un carrello rispetto a un ordine precedente.

In questi casi PHP mette a disposizione diverse funzioni per confrontare gli array senza dover scrivere manualmente molti cicli foreach. In questo tutorial useremo soprattutto:

  • array_diff, per trovare gli elementi presenti nel primo array ma assenti negli altri;
  • array_intersect, per ottenere gli elementi comuni tra più array;
  • array_diff_assoc, quando è necessario confrontare sia chiavi sia valori;
  • array_intersect_assoc, per individuare coppie chiave-valore identiche.

Queste funzioni sono particolarmente utili per sincronizzare dati, verificare autorizzazioni e calcolare differenze tra configurazioni.

Codice completo

<?php

// Permessi richiesti da un ruolo applicativo
$permessiRichiesti = [
    ´visualizza_report´,
    ´esporta_dati´,
    ´gestisci_utenti´
];

// Permessi realmente assegnati all´utente
$permessiAssegnati = [
    ´visualizza_report´,
    ´gestisci_utenti´,
    ´modifica_profilo´
];

// Permessi richiesti ma non ancora assegnati
$permessiMancanti = array_diff(
    $permessiRichiesti,
    $permessiAssegnati
);

// Permessi assegnati che non sono più richiesti
$permessiDaRimuovere = array_diff(
    $permessiAssegnati,
    $permessiRichiesti
);

// Permessi presenti in entrambi gli array
$permessiConfermati = array_intersect(
    $permessiRichiesti,
    $permessiAssegnati
);

echo ´<h3>Permessi mancanti</h3>´;
echo ´<pre>´;
print_r($permessiMancanti);
echo ´</pre>´;

echo ´<h3>Permessi da rimuovere</h3>´;
echo ´<pre>´;
print_r($permessiDaRimuovere);
echo ´</pre>´;

echo ´<h3>Permessi confermati</h3>´;
echo ´<pre>´;
print_r($permessiConfermati);
echo ´</pre>´;


// Confronto di array associativi
$configAttuale = [
    ´tema´ => ´scuro´,
    ´lingua´ => ´it´,
    ´notifiche´ => true
];

$configDesiderata = [
    ´tema´ => ´chiaro´,
    ´lingua´ => ´it´,
    ´notifiche´ => true
];

// Restituisce le coppie presenti nel primo array
// ma diverse per chiave o valore nel secondo
$differenzeConfigurazione = array_diff_assoc(
    $configAttuale,
    $configDesiderata
);

echo ´<h3>Differenze di configurazione</h3>´;
echo ´<pre>´;
print_r($differenzeConfigurazione);
echo ´</pre>´;

Spiegazione

Usare array_diff

array_diff confronta i valori del primo array con quelli degli array successivi. Il risultato contiene gli elementi presenti nel primo array e non presenti nel secondo. Nel codice, array_diff($permessiRichiesti, $permessiAssegnati) restituisce esporta_dati, perché è richiesto ma non assegnato.

Il confronto considera i valori, non le chiavi. Inoltre, l’ordine degli elementi non è importante. Se i due array contengono gli stessi valori in ordine diverso, non verranno considerate differenze.

Le chiavi originali del primo array vengono mantenute. Se serve un array indicizzato consecutivamente, è possibile applicare array_values:

<?php

$prodotti = [
    2 => ´tastiera´,
    5 => ´mouse´
];

$esclusi = [
    ´mouse´
];

$disponibili = array_diff($prodotti, $esclusi);

// Reindicizza l´array: 0 => tastiera
$disponibili = array_values($disponibili);

print_r($disponibili);

Usare array_intersect

array_intersect restituisce i valori comuni tra il primo array e uno o più array aggiuntivi. Nel nostro esempio identifica i permessi presenti sia tra quelli richiesti sia tra quelli già assegnati.

Anche in questo caso vengono confrontati soltanto i valori e vengono mantenute le chiavi del primo array. Per confrontare più insiemi contemporaneamente è sufficiente aggiungere altri argomenti:

<?php

$gruppoA = [´php´, ´javascript´, ´sql´];
$gruppoB = [´php´, ´sql´, ´python´];
$gruppoC = [´php´, ´sql´, ´html´];

$competenzeComuni = array_intersect(
    $gruppoA,
    $gruppoB,
    $gruppoC
);

print_r($competenzeComuni);

Confrontare chiavi e valori

Con gli array associativi può essere necessario verificare non soltanto se un valore è presente, ma anche se è associato alla chiave corretta. In questo scenario array_diff_assoc confronta contemporaneamente chiavi e valori.

Per esempio, la configurazione con tema scuro sarà considerata diversa da una configurazione con la stessa chiave ma valore chiaro. Se invece si vuole confrontare soltanto le chiavi, si può usare array_diff_key.

<?php

$prima = [
    ´nome´ => ´Mario´,
    ´email´ => ´[email protected]´
];

$seconda = [
    ´nome´ => ´Mario´,
    ´email´ => ´[email protected]´
];

$differenze = array_diff_assoc($prima, $seconda);

print_r($differenze);

Best practice

  • Descrivi chiaramente la direzione del confronto: array_diff($nuovi, $vecchi) significa “elementi nuovi”, mentre l’ordine inverso individua gli elementi rimossi.
  • Normalizza i dati prima del confronto: elimina spazi superflui con trim e usa una convenzione coerente per maiuscole e minuscole.
  • Ricorda che il confronto è normalmente non rigoroso: per confronti più precisi tra valori complessi, valuta funzioni personalizzate o confronti espliciti.
  • Reindicizza quando necessario: dopo array_diff o array_intersect, usa array_values se l’array verrà convertito in JSON o usato come lista.
  • Valida i dati esterni: gli array provenienti da richieste HTTP, file o API devono essere controllati prima del confronto.
  • Usa array_diff_assoc per configurazioni: confrontare soltanto i valori può produrre risultati errati quando le chiavi hanno un significato importante.
  • Considera la complessità: per dataset molto grandi è opportuno misurare le prestazioni e valutare strutture dati più adatte, come mappe indicizzate per ID.

Riepilogo

array_diff è ideale per individuare gli elementi mancanti o da eliminare, mentre array_intersect permette di trovare i valori condivisi tra più array. Quando si lavora con array associativi e la relazione tra chiave e valore è importante, bisogna preferire array_diff_assoc o array_intersect_assoc.

Queste funzioni rendono il codice più breve e leggibile rispetto a una serie di cicli manuali. La scelta corretta dipende sempre dalla domanda da risolvere: quali dati sono nuovi, quali sono stati rimossi, quali coincidono e quali coppie chiave-valore sono realmente uguali.

Approfondisci con risorse ufficiali

SHARE