Menu

PHP array_merge(): unire due o più array

array_merge($a, $b) unisce più array in uno: i valori con chiavi numeriche vengono accodati e rinumerati, e per le chiavi stringa vince l'array successivo. Scopri in cosa array_merge differisce dall'operatore + e dalla sintassi spread [...$a, ...$b], come unire una lista di array e quando sono più adatti array_merge_recursive o array_replace.

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

array_merge($a, $b) restituisce un nuovo array con gli elementi di $a seguiti da quelli di $b. Le chiavi numeriche vengono rinumerate da 0; quando entrambi gli array hanno la stessa chiave stringa, vince il valore dell'array successivo. Puoi passare quanti array vuoi.

array_merge() non modifica i suoi argomenti. Restituisce l'array combinato, quindi assegna il risultato: $all = array_merge($all, $more);.

Le chiavi numeriche vengono rinumerate

array_merge() tratta le chiavi intere come posizioni, non come nomi. Ogni elemento con chiave intera viene accodato e riceve una nuova chiave a partire da 0, anche se gli array usavano gli stessi numeri o avevano buchi. È ciò che vuoi per le liste, e una sorpresa quando i numeri sono ID.

Le chiavi stringa che sembrano interi ('101') vengono memorizzate come interi, quindi anche loro vengono rinumerate. Chiavi come 'id101' restano come sono.

array_merge vs l'operatore +

Anche l'operatore + (unione di array) combina array, ma con la regola opposta: per ogni chiave che esiste già nell'array di sinistra vince il valore di sinistra e quello di destra viene scartato. Non rinumera mai. Questo rende + il modo naturale per riempire i valori di default, e array_merge() il modo naturale per sovrascriverli.

array_merge($a, $b)$a + $b
Stessa chiave stringavalore di $bvalore di $a
Chiavi intererinumerate, tutti i valori mantenutimantenute, $b perde nei conflitti
Uso tipicounire liste, sovrascrivere impostazioniriempire i default, mantenere gli ID

L'ultimo esempio del blocco è la classica trappola di +: ['a', 'b'] + ['x', 'y', 'z'] dà a, b, z, perché le chiavi 0 e 1 esistono già a sinistra.

Sintassi spread: [...a,...a, ...b]

L'operatore spread espande gli array dentro un array letterale. Si comporta come array_merge(): le chiavi intere vengono rinumerate e, da PHP 8.1, le chiavi stringa sono consentite e vince l'ultima. Si legge bene quando mescoli array e valori singoli.

Per accodare un array a uno esistente sul posto, vedi array_push() con l'operatore spread.

Unire un array di array

Quando gli array da combinare sono a loro volta in una lista, espandi quella lista dentro array_merge(). È anche il modo veloce di unire dentro un ciclo: raccogli i pezzi, poi uniscili una volta.

Scrivere $all = array_merge($all, $batch); dentro il ciclo funziona, ma copia l'intero array che cresce a ogni passaggio, e con migliaia di elementi diventa lento.

array_merge_recursive e array_replace

array_merge_recursive() unisce anche gli array annidati, ma per una chiave stringa duplicata con valori semplici non sovrascrive: raccoglie entrambi i valori in un nuovo array. Per la configurazione raramente è ciò che vuoi. Lì lo strumento giusto è di solito array_replace_recursive(): sovrascrive i valori a ogni livello e mantiene le chiavi.

Leggi le tre righe JSON dall'alto verso il basso: array_merge() ha sostituito l'intero array db e perso host, array_merge_recursive() ha trasformato port e debug in liste di due elementi, e array_replace_recursive() ha prodotto la configurazione che intendevi.

Errore comune: unire non rimuove nulla

array_merge() mantiene i valori duplicati che stanno sotto chiavi diverse. Unendo due liste di tag ottieni due volte ogni tag in comune. Passa il risultato a array_unique() e poi a array_values() per rinumerarlo.

La pagina su array_unique tratta la rimozione dei duplicati da righe e array annidati.

Domande frequenti

Qual è la differenza tra array_merge e + in PHP?

Per le chiavi stringa duplicate, array_merge($a, $b) tiene il valore di $b, mentre $a + $b tiene il valore di $a. Per le chiavi numeriche, array_merge() accoda e rinumera tutto, mentre + mantiene le chiavi numeriche e scarta ogni elemento di $b la cui chiave esiste già in $a.

Come unisco array mantenendo le chiavi numeriche?

Usa $a + $b se deve vincere l'array di sinistra, oppure array_replace($a, $b) se deve vincere quello di destra. array_merge() rinumera sempre le chiavi numeriche da 0.

Come unisco un array di array in PHP?

Espandi l'array esterno dentro array_merge(): $all = array_merge(...$lists);. Per una lista vuota restituisce []. Raccogli prima gli array in un ciclo e uniscili una volta sola alla fine; chiamare array_merge() dentro il ciclo copia ogni volta il risultato che cresce.

Posso usare l'operatore spread con chiavi stringa in PHP?

Sì, da PHP 8.1. [...$a, ...$b] si comporta allora come array_merge($a, $b): le chiavi numeriche vengono rinumerate e una chiave stringa successiva sovrascrive una precedente.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA