PHP Array Merge: Una Guida Approfondita
La funzione PHP array_merge() è uno strumento potente per combinare array in un unico array. Accetta due o più array come argomenti e li unisce.
La funzione PHP array_merge() combina due o più array in un unico array. Accetta uno o più array come argomenti e restituisce un nuovo array; gli array originali rimangono invariati. Questa guida illustra come array_merge() gestisce le chiavi string, le chiavi numeriche e gli array annidati, le insidie da tenere d'occhio e le differenze rispetto all'operatore di unione +.
Le due regole che spiegano quasi ogni risultato sono:
- Le chiavi string presenti in più di un array vengono sovrascritte — il valore dell'array successivo ha la precedenza.
- Le chiavi numeriche non vengono mai sovrascritte. Ogni valore viene aggiunto e le chiavi vengono reindicizzate sequenzialmente a partire da
0.
Nota: a partire da PHP 8.0, passare un argomento non-array a
array_merge()genera unTypeError. (In PHP 7 generava un avviso e restituivanull.) Chiamarearray_merge()senza argomenti restituisce un array vuoto.
Utilizzo di Base di array_merge()
L'utilizzo di base della funzione array_merge() è semplice. Basta passare due o più array come argomenti e la funzione restituirà un nuovo array che è il risultato dell'unione degli array. Ecco un esempio:
Esempio della funzione PHP array_merge
Output:
Array
(
[color] => green
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => rectangle
[4] => 4
)Nell'output si notano due cose:
- La chiave string
colorè presente in entrambi gli array, quindi il valore di$array2(green) ha sovrascritto quello di$array1(red). - Le chiavi numeriche non sono state preservate. I valori originali
2e4di$array1e il4di$array2sono stati tutti mantenuti (nessuno è stato sovrascritto) e rinumerati0,1,4.
Reindicizzazione delle Chiavi Numeriche
Poiché le chiavi numeriche vengono rinumerate, non è possibile fare affidamento sulla sopravvivenza delle chiavi intere originali dopo un'unione. Anche chiamare array_merge() su un singolo array è un metodo comune e veloce per reindicizzarlo:
<?php
$nums = [10 => "a", 25 => "b", 7 => "c"];
$result = array_merge($nums);
print_r($result);
?>Output:
Array
(
[0] => a
[1] => b
[2] => c
)Se hai bisogno di mantenere chiavi intere specifiche, utilizza l'operatore di unione + o array_replace().
Unione di Array Multidimensionali
La funzione array_merge() può essere utilizzata anche per unire array multidimensionali. Per farlo, basta passare ogni array come argomento alla funzione. Ecco un esempio:
PHP Unione di array multidimensionali con array_merge_recursive
Output:
Array
(
[color] => Array
(
[favorite] => green
)
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => rectangle
[4] => 4
)Da notare che array_merge() non unisce gli array annidati. Quando due array condividono una chiave string il cui valore è a sua volta un array, il valore annidato dell'array successivo sostituisce interamente quello precedente — qui ["favorite" => "green"] ha semplicemente sovrascritto ["favorite" => "red"]. Per unire gli array annidati in modo ricorsivo anziché sovrascriverli, utilizza array_merge_recursive().
array_merge() vs l'Operatore di Unione
PHP offre anche l'operatore di unione + per combinare array, ma si comporta in modo molto diverso da array_merge(). L'operatore di unione mantiene il valore dell'operando di sinistra in caso di collisione delle chiavi e non reindicizza mai le chiavi numeriche.
<?php
$array1 = ["a", "b", "c"];
$array2 = ["x", "y", "z", "w"];
print_r(array_merge($array1, $array2)); // appends + reindexes
print_r($array1 + $array2); // keeps left, no reindex
?>Output:
Array
(
[0] => a
[1] => b
[2] => c
[3] => x
[4] => y
[5] => z
[6] => w
)
Array
(
[0] => a
[1] => b
[2] => c
[3] => w
)Con array_merge(), ogni elemento viene mantenuto e rinumerato. Con +, gli indici da 0 a 2 esistevano già in $array1 e hanno la precedenza; solo l'indice 3 (w) viene acquisito da $array2. Usa + quando vuoi riempire le chiavi mancanti (ad esempio unendo le opzioni dell'utente sui valori predefiniti) preservando i valori esistenti e le chiavi intere; usa array_merge() quando vuoi un elenco piatto con indici sequenziali. Consulta PHP Operators per ulteriori informazioni.
Unione di un Array Indicizzato con un Array Associativo
Quando si unisce un array indicizzato con un array associativo, i valori di entrambi gli array vengono combinati. Ecco un esempio:
Esempio PHP di unione di un array indicizzato con un array associativo tramite array_merge
Output:
Array
(
[0] => a
[1] => b
[2] => c
[a] => apple
[b] => banana
[c] => cherry
)Come si può vedere, i valori di entrambi gli array vengono combinati. Poiché le chiavi sono di tipo diverso (numeriche vs. string), non avviene alcuna sovrascrittura. Questo è un dettaglio importante da tenere a mente quando si uniscono array con tipi di chiave diversi.
Unione di un Array Associativo con un Array Indicizzato
Il risultato dell'unione di un array associativo con un array indicizzato è simile. I valori vengono combinati e le chiavi vengono preservate in base al loro tipo. Ecco un esempio:
PHP unione di un array associativo con un array indicizzato tramite array_merge
Output:
Array
(
[a] => apple
[b] => banana
[c] => cherry
[0] => a
[1] => b
[2] => c
)Come mostrato, i valori si combinano senza conflitti. Le chiavi string di $array1 vengono preservate, mentre le chiavi numeriche di $array2 vengono reindicizzate a partire da 0.
Considerazioni sulle Prestazioni
La funzione array_merge() ha una complessità temporale lineare, il che significa che il tempo necessario per unire gli array aumenta linearmente con la dimensione degli array. Per questo motivo, è importante ridurre al minimo il numero di array da unire ed evitare di utilizzare la funzione su array molto grandi.
Conclusione
La funzione array_merge() è uno strumento versatile per combinare array in PHP. Ricorda le due regole fondamentali: le chiavi string vengono sovrascritte dagli array successivi, mentre le chiavi numeriche vengono aggiunte e reindicizzate a partire da 0. Quando questi comportamenti predefiniti non si adattano al tuo caso, scegli una funzione correlata:
array_merge_recursive()— unisce gli array annidati invece di sovrascriverli.array_replace()— sostituisce i valori per chiave preservando le chiavi numeriche.- L'operatore di unione
+— mantiene i valori dell'operando sinistro e non reindicizza mai. array_combine()— costruisce un array a partire da un array di chiavi e un array di valori separati.