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 stringa | valore di $b | valore di $a |
| Chiavi intere | rinumerate, tutti i valori mantenuti | mantenute, $b perde nei conflitti |
| Uso tipico | unire liste, sovrascrivere impostazioni | riempire 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: [...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.