Apa perbedaan antara array_merge dan array + array?

116

Pertanyaan yang cukup sederhana. Apa perbedaan antara:

$merged = array_merge($array1, $array2);

dan

$merged = $array1 + $array2;

?

Pengembang Pixel
sumber
6
kemungkinan duplikat operator + untuk array di PHP?
Gordon
3
mungkin Gordon, melewatkannya karena judulnya tidak memiliki array_merge di dalamnya.
Pengembang Pixel

Jawaban:

73

Perbedaannya adalah:

The +Operator mengambil penyatuan dua array, sedangkan array_mergefungsi mengambil serikat NAMUN duplikat kunci yang ditimpa.

Mike Lewis
sumber
Jadi, apa perbedaan antara 2: array_merge , tanda plus ini (meskipun saya harus beralih di sekitar array)?
Joseph Silber
15
Perhatian bagi pemula di sini, hasil operasi dalam kedua kasus tersebut adalah null jika salah satu array bernilai null . Beberapa orang mungkin tidak peduli dengan asumsi ini karena ini adalah operasi gabungan, hasilnya akan menjadi array yang tepat (bukan-null) jika salah satunya adalah null . Tapi, itu berlaku jika salah satu array adalah array kosong. Jadi, sebagai praktik yang baik, saya pikir, kita harus menginisialisasi array input sebagai array kosong. Apa yang kalian katakan?
Sandeepan Nath
6
Jika ada kunci duplikat, "mengambil serikat" akan selalu memiliki menyingkirkan salah satu dari mereka. Perbedaannya adalah yang mana.
alexis
5
Maaf, jawaban ini membingungkan, salah, dan tidak lengkap. : -o Lihat komentar @ alexis tentang bit yang membingungkan (meskipun dia juga hanya setengah dari kebenaran tentang OP). 2. Lihat jawaban Yehosef tentang apa yang array_merge sebenarnya ... 3. Dan lihat jawaban BoltClock tentang perbedaan penting lainnya yang tidak disebutkan di sini: array_mergemenyetel ulang kunci numerik, tidak seperti +.
Sz.
tidak spesifik sama sekali. tidak membantu. tidak menonjolkan perbedaannya. penjelasan yang terlalu tinggi.
ahnbizcad
90

Berikut adalah tes ilustrasi sederhana:

$ar1 = [
   0  => '1-0',
  'a' => '1-a',
  'b' => '1-b'
];


$ar2 = [
   0  => '2-0',
   1  => '2-1',
  'b' => '2-b',
  'c' => '2-c'
];

print_r($ar1+$ar2);

print_r(array_merge($ar1,$ar2));

dengan hasil:

Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 1-b
  [1] => 2-1
  [c] => 2-c
)
Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 2-b
  [1] => 2-0
  [2] => 2-1
  [c] => 2-c
)

Perhatikan bahwa kunci non-numerik duplikat akan mengambil nilai pertama menggunakan operator gabungan tetapi yang kemudian menggunakan array_merge.

Untuk kunci numerik, nilai pertama akan digunakan dengan operator gabungan sedangkan semua nilai akan digunakan dengan array_merge, baru saja diindeks ulang.

Saya biasanya menggunakan operator union untuk array asosiatif dan array_merge untuk numerik. Tentu saja, Anda juga dapat menggunakan array_merge untuk asosiatif, hanya saja nilai yang lebih baru menimpa nilai sebelumnya.

Yehosef
sumber
52

array_merge()menyebabkan semua kunci numerik yang ditemukan dalam larik input akan diindeks ulang dalam larik resultan. Operator serikat +tidak menyebabkan indeks ulang.

BoltClock
sumber
29

array_merge vs plus

Sumber: https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

Berhenti menggunakan array_merge ($ defaults, $ options):

function foo(array $options)
{
   $options += ['foo' => 'bar'];

   // ...
}

Catatan : fungsi array_replace ada sejak PHP5.3.

luchaninov
sumber
mengapa kita harus berhenti menggunakan array_merge ($ default, $ options) :? karena tidak mengizinkan kunci yang tidak diindeks?
ahnbizcad
tapi jawabannya benar-benar didaktik +1
snr
20

Tanda + hanya mengambil nilai dari kemunculan pertama dari kunci array.
array_merge mengambil nilai dari kemunculan terakhir dari kunci array.

Contoh:

$first = ['a'=>'one',
        'b'=>'two',
        'c'=>'three'];

$second = ['a'=>'fourth',
        'b'=>'fifth',
        'c'=>'sixth',
        '3'=>'number three'];

$merged = $first + $second;
echo "<pre> plus sign merge\n";
var_dump($merged);

$merged = array_merge($first,$second);
echo "\n array_merge function merge\n";
var_dump($merged);

Output ini:

tanda tambah menggabungkan
larik (4) {
["a"] =>
string (3) "satu"
["b"] =>
string (3) "dua"
["c"] =>
string (5) "tiga"
[3] =>
string (12) "nomor tiga"
}

array_merge function menggabungkan
larik (4) {
["a"] =>
string (6) "keempat"
["b"] =>
string (5) "kelima"
["c"] =>
string (5) "keenam"
[0] =>
string (12) "nomor tiga"
}

Menarik untuk dicatat dalam hal ini adalah bahwa array_mergeactally menghapus '3' indeks nomor tiga meskipun itu string, karena itu angka.

Jadi berhati-hatilah saat menggabungkan dengan array_mergearray dengan indeks numerik. Mereka mungkin kehilangan kunci mereka. jika mereka penting bagi Anda, awali dengan sebuah string.

jadi alih-alih '3' => 'three'menggunakan sesuatu seperti'_3' => 'three'

Tschallacka
sumber
5
" meskipun itu string, karena itu angka " layak mendapat +1 :-)
e2-e4
5

Saya percaya array_mergemenimpa kunci non_numerik duplikat sementara $array1 + $array2tidak.

klennepette.dll
sumber
3

Contoh lain (array tanpa kunci eksplisit; jelas terkait dengan cara kerja +dan operator array_merge, tetapi hal yang "jelas" lebih sederhana jika dilihat;))

$a = array('apple');
$b = array('orange', 'lemon');

echo '$a + $b = ';             print_r($a + $b);
echo 'array_merge($a, $b) = '; print_r(array_merge($a, $b));

akan memberi:

$a + $b = Array
(
    [0] => apple
    [1] => lemon
)
array_merge($a, $b) = Array
(
    [0] => apple
    [1] => orange
    [2] => lemon
)
jacek.ciach
sumber
0

Harap perhatikan perbedaan lainnya: union (+) tidak akan menimpa nilai yang tidak kosong dengan nilai kosong (dengan mempertimbangkan kunci yang sama), sedangkan array_merge akan:

$a = array('foo' => 'bar');
$b = array('foo' => ''); // or false or 0

print_r($a+$b);
print_r(array_merge($a, $b);

Keluaran:

Array
(
    [foo] => bar
)
Array
(
    [foo] => 0
)
Zalem Warga
sumber
0

Jadi ternyata jika Anda mengubah urutan union dan merge akan melakukan hal yang sama

$a = array('foo' => 'bar', 'x' => 'fromA');
$b = array('foo' => null, 'x' => 'fromB');

echo '$a+$b: ';
var_dump($a+$b);

echo '$b+$a: ';
var_dump($b+$a);

echo 'array_merge($a, $b): ';
var_dump(array_merge($a, $b));

echo 'array_merge($b, $a): ';
var_dump(array_merge($b, $a));

Keluaran:

$a+$b: array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}
$b+$a: array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($a, $b): array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($b, $a): array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}

Ingatlah urutan array.

Nedyalko Dyakov
sumber
Anda mengubah urutan: $a+$bvs $b+$a. Tidak ada yang diganti.
ZbyszekKr
Ups, 🤔 @ ZbyszekKr terima kasih. Saya tidak tahu bagaimana saya melewatkannya. Akan mengunjungi kembali dan mengedit jawaban saya.
Nedyalko Dyakov