array_merge($a, $b) mengembalikan array baru berisi elemen-elemen $a lalu diikuti elemen-elemen $b. Key numerik dinomori ulang mulai dari 0; saat kedua array punya key string yang sama, nilai dari array yang belakangan yang menang. Kamu bisa memberikan array sebanyak yang kamu mau.
array_merge() tidak mengubah argumennya. Fungsi ini mengembalikan array gabungan, jadi simpan hasilnya: $all = array_merge($all, $more);.
Key numerik dinomori ulang
array_merge() memperlakukan key integer sebagai posisi, bukan sebagai nama. Setiap elemen dengan key integer ditambahkan di akhir dan mendapat key baru mulai dari 0, bahkan kalau array-array itu memakai angka yang sama atau punya celah. Itulah yang kamu mau untuk list, tetapi mengejutkan kalau angkanya berupa ID.
Key string yang terlihat seperti integer ('101') disimpan sebagai integer, jadi key itu juga dinomori ulang. Key seperti 'id101' tetap seperti semula.
array_merge vs operator +
Operator + (union array) juga menggabungkan array, tetapi dengan aturan kebalikannya: untuk key yang sudah ada di array kiri, nilai kiri yang menang dan nilai kanan dibuang. Operator ini tidak pernah menomori ulang. Karena itu + adalah cara alami untuk mengisi nilai bawaan, dan array_merge() adalah cara alami untuk menimpanya.
array_merge($a, $b) | $a + $b | |
|---|---|---|
| Key string sama | nilai dari $b | nilai dari $a |
| Key integer | dinomori ulang, semua nilai disimpan | dipertahankan, $b kalah saat bentrok |
| Kegunaan umum | menggabungkan list, menimpa pengaturan | mengisi nilai bawaan, mempertahankan ID |
Contoh terakhir di blok tadi adalah jebakan klasik +: ['a', 'b'] + ['x', 'y', 'z'] menghasilkan a, b, z, karena key 0 dan 1 sudah ada di sebelah kiri.
Sintaks spread: [...b]
Spread operator membongkar array di dalam literal array. Perilakunya seperti array_merge(): key integer dinomori ulang, dan sejak PHP 8.1 key string diperbolehkan dan yang belakangan yang menang. Sintaks ini enak dibaca saat kamu mencampur array dengan nilai tunggal.
Untuk menambahkan sebuah array ke array yang sudah ada secara langsung, lihat array_push() dengan spread operator.
Menggabungkan array berisi array
Kalau array-array yang ingin digabung berada di dalam sebuah list, spread list itu ke dalam array_merge(). Ini juga cara cepat untuk menggabungkan di dalam loop: kumpulkan potongannya, lalu gabungkan sekali.
Menulis $all = array_merge($all, $batch); di dalam loop memang berhasil, tetapi seluruh array yang terus membesar disalin di setiap putaran, dan itu jadi lambat dengan ribuan item.
array_merge_recursive dan array_replace
array_merge_recursive() juga menggabungkan array bersarang, tetapi untuk key string yang sama dengan nilai biasa, fungsi ini tidak menimpa: kedua nilainya dikumpulkan ke dalam array baru. Itu jarang sesuai keinginanmu untuk konfigurasi. Di situ, array_replace_recursive() biasanya alat yang tepat: fungsi ini menimpa nilai di setiap level dan mempertahankan key.
Baca ketiga baris JSON itu dari atas ke bawah: array_merge() mengganti seluruh array db dan kehilangan host, array_merge_recursive() mengubah port dan debug menjadi list berisi dua elemen, dan array_replace_recursive() menghasilkan konfigurasi yang kamu maksud.
Kesalahan umum: penggabungan tidak menghapus apa pun
array_merge() tetap menyimpan nilai duplikat yang berada di key berbeda. Menggabungkan dua list tag membuat setiap tag yang sama muncul dua kali. Lewatkan hasilnya ke array_unique(), lalu array_values() untuk menomorinya ulang.
Halaman array_unique membahas cara menghapus duplikat dari baris data dan array bersarang.
Pertanyaan yang sering diajukan
Apa bedanya array_merge dan + di PHP?
Untuk key string yang sama, array_merge($a, $b) menyimpan nilai dari $b, sedangkan $a + $b menyimpan nilai dari $a. Untuk key numerik, array_merge() menambahkan semuanya di akhir dan menomorinya ulang, sedangkan + mempertahankan key numerik dan membuang elemen $b yang key-nya sudah ada di $a.
Bagaimana cara menggabungkan array dan tetap mempertahankan key numerik?
Pakai $a + $b kalau array kiri yang harus menang, atau array_replace($a, $b) kalau array kanan yang harus menang. array_merge() selalu menomori ulang key numerik mulai dari 0.
Bagaimana cara menggabungkan array berisi array di PHP?
Spread array luarnya ke dalam array_merge(): $all = array_merge(...$lists);. Untuk list kosong, hasilnya []. Kumpulkan dulu array-array itu di dalam loop, lalu gabungkan sekali di akhir; memanggil array_merge() di dalam loop menyalin hasil yang terus membesar setiap kali.
Apakah spread operator bisa dipakai dengan key string di PHP?
Bisa, sejak PHP 8.1. [...$a, ...$b] lalu berperilaku seperti array_merge($a, $b): key numerik dinomori ulang dan key string yang belakangan menimpa yang sebelumnya.