Menu

PHP array_unique(): rimuovere i valori duplicati

array_unique($array) rimuove i valori duplicati e tiene la prima occorrenza di ciascuno, con la sua chiave originale. Impara a reindicizzare il risultato, rimuovere i duplicati ignorando maiuscole e minuscole, rendere unico un array multidimensionale e contare o trovare i duplicati.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

array_unique($array) restituisce l'array senza i valori duplicati. La prima occorrenza di ogni valore resta, sotto la sua chiave originale, e le copie successive vengono scartate.

Il primo risultato mantiene le chiavi 0, 1, 3: le posizioni in cui ogni valore è comparso per la prima volta. Racchiudi la chiamata in array_values() quando vuoi una lista pulita, per esempio prima di json_encode.

Come array_unique decide che due valori sono uguali

Di default ogni valore viene convertito in stringa e le stringhe vengono confrontate. Quindi 1, "1" e 1.0 contano come lo stesso valore, e vince il primo. Il secondo argomento cambia il confronto.

FlagDue valori sono duplicati quando
SORT_STRING (default)(string) $a === (string) $b
SORT_REGULAR$a == $b
SORT_NUMERICsono uguali come numeri

Con il default, "01" sopravvive perché la stringa "01" non è la stringa "1". Con SORT_REGULAR viene scartato, perché "01" == 1 è vero. Il confronto debole fa anche corrispondere il booleano true a qualsiasi valore non vuoto. Controlla l'output prima di farci affidamento con tipi misti; la pagina sugli operatori di confronto spiega le regole.

Rimuovere i duplicati ignorando maiuscole e minuscole

array_unique distingue maiuscole e minuscole: "PHP" e "php" sono diversi. Per trattarli come duplicati mantenendo la grafia originale del primo, trova le chiavi uniche su una copia in minuscolo e tieni quelle chiavi dall'originale.

array_map costruisce una copia in minuscolo con le stesse chiavi, array_unique tiene le chiavi delle prime occorrenze e array_intersect_key estrae quelle chiavi dall'array originale. Per il testo accentato o giapponese, usa mb_strtolower al posto di strtolower.

array_unique su un array multidimensionale

Senza flag, array_unique converte ogni riga nella stringa "Array", quindi tutte le righe sembrano identiche e sopravvive solo la prima, con un warning "Array to string conversion" per ogni riga. Passa SORT_REGULAR per confrontare le righe intere. Per tenere una riga per ogni valore di un singolo campo, array_column con null e una chiave indice è più semplice.

Il secondo approccio tiene l'ultima riga per ogni email perché ogni riga successiva sovrascrive la precedente sotto la stessa chiave. La pagina su array_column spiega la chiave indice in dettaglio.

Trovare e contare i valori duplicati

array_count_values() restituisce quante volte compare ogni valore. Filtralo per i conteggi maggiori di uno e hai i duplicati.

L'ultimo controllo è una riga comune per verificare se un array ha dei duplicati.

Valori unici più veloci per array grandi

array_unique converte ogni valore in stringa prima di confrontarlo, il che va bene per migliaia di valori. Per una lunga lista di interi o stringhe, invertire l'array è più veloce: i valori diventano chiavi, e le chiavi sono uniche per definizione.

I tempi cambiano da un'esecuzione all'altra, ma la versione con il flip è di solito parecchie volte più veloce. Funziona solo con valori che possono essere chiavi di array (interi e stringhe), e le stringhe numeriche come "5" tornano come interi.

Domande frequenti

array_unique mantiene le chiavi?

Sì. Tiene la prima occorrenza di ogni valore sotto la sua chiave originale e scarta le successive, quindi le chiavi possono avere buchi. Usa array_values(array_unique($arr)) per rinumerarle da 0.

Come uso array_unique su un array multidimensionale?

Passa SORT_REGULAR così vengono confrontate le righe intere: array_unique($rows, SORT_REGULAR). Per tenere una riga per ogni valore di un campo, come una riga per email, indicizza le righe per quel campo: array_column($rows, null, 'email') tiene l'ultima riga per ogni email.

Come rimuovo i duplicati ignorando maiuscole e minuscole?

Trova le chiavi uniche su una copia in minuscolo e tieni quelle chiavi dall'originale: array_intersect_key($arr, array_unique(array_map('strtolower', $arr))). Usa mb_strtolower per il testo non ASCII.

Come trovo quali valori sono duplicati in un array PHP?

Contali con array_count_values($arr), poi tieni i conteggi maggiori di uno: array_keys(array_filter(array_count_values($arr), fn($n) => $n > 1)). array_count_values funziona solo con stringhe e interi.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA