Apa perbedaan antara array_merge dan array + array?


Jawaban:


73

Perbedaannya adalah:

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


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.


52

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



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'


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

5

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


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
)

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
)

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.