Array_merge ve array + array arasındaki fark nedir?


Yanıtlar:


73

Fark şudur:

+Oysa operatörü İki dizinin birliğini alır array_mergefonksiyon birliği alır ANCAK yinelenen anahtarlar üzerine yazılır.


: Yani, bu 2 arasında ne fark array_merge , artı işareti (Ben her ne kadar diziler etrafında geçmek için)?
Joseph Silber

15
Burada yeni başlayanlar için dikkatli bir kelime, her iki durumda da operasyonun sonucudur boş diziler herhangi biri olup olmadığını boş . Bir sendika operasyondur beri Bazıları bunlardan biri ise, sonuç doğru (değil-null) dizi olacak, bu varsayarak umurumda olmayabilir boş . Ancak dizilerden biri boş bir diziyse bu doğrudur. Bu yüzden, iyi bir uygulama olarak, girdi dizilerini boş diziler olarak başlatmamız gerektiğini düşünüyorum. Ne diyorsunuz?
Sandeepan Nath

6
Yinelenen anahtarlar, "birliği alarak" varsa her zaman olacaktır sahip bunlardan birinin kurtulmak için. Aradaki fark hangisi.
alexis

5
Üzgünüz, bu cevap kafa karıştırıcı, yanlış ve eksik. : -o @ alexis'in kafa karıştırıcı parça hakkındaki yorumuna bakın (yine de OP ile ilgili gerçeğin sadece yarısıdır). 2. Yehosef'in array_merge gerçekte ne işe yaradığına dair cevabına bakın ... 3. Ve BoltClock'un burada bahsedilmeyen başka bir önemli farkla ilgili cevabına bakın : array_mergeaksine, sayısal tuşları sıfırlar +.
Sz.

hiç spesifik değil. yararlı değil. farkı vurgulamıyor. çok yüksek düzeyde bir açıklama.
ahnbizcad

90

İşte basit bir açıklayıcı test:

$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));

sonuçla beraber:

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
)

Yinelenen sayısal olmayan anahtarların birleşim işlecini kullanarak ilk değeri alacağına, ancak daha sonra array_merge işlevini kullanacağına dikkat edin.

Sayısal anahtarlar için, ilk değer birleşim operatörüyle kullanılırken, tüm değerler dizi_merge ile yeniden dizine eklenmiş olarak kullanılır.

Genelde ilişkisel diziler için birleşim işlecini ve sayısal için array_merge kullanıyorum. Elbette, ilişkisel için array_merge'ı da kullanabilirsiniz, sadece sonraki değerler öncekilerin üzerine yazılır.


52

array_merge()girdi dizilerinde bulunan tüm sayısal anahtarların sonuç dizide yeniden dizine alınmasına neden olur. Union operatörü +bir reindex'e neden olmaz.



20

+ İşareti, yalnızca bir dizi anahtarının ilk oluşumundaki değeri alır .
array_merge, değeri bir dizi anahtarının son oluşumundan alır .

Misal:

$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);

Bu çıktılar:

artı işareti birleştirme
dizisi (4) {
["a"] =>
dize (3) "bir"
["b"] =>
dize (3) "iki"
["c"] =>
dize (5) "üç"
[3] =>
dize (12) "üç numara"
}

array_merge function merge
array (4) {
["a"] =>
string (6) "dördüncü"
["b"] =>
string (5) "beşinci"
["c"] =>
string (5) "altıncı"
[0] =>
dize (12) "üç numara"
}

Bu ilginçtir ki array_mergeactally siler bir sayı olduğu için, sayı bir dize olsa bile üç '3' indeksini.

Bu nedenle array_merge, sayısal indeksli dizilerle birleştirirken dikkatli olun . Anahtarlarını kaybedebilirler. eğer sizin için önemliyse onlardan önce bir ip ile gelir.

bu yüzden '3' => 'three'gibi bir şey kullanmak yerine'_3' => 'three'


5
" bir dizi olmasına rağmen, çünkü bir sayı " 1'i hak ediyor :-)
e2-e4

5

array_mergeYinelenen nümerik olmayan anahtarların üzerine yazdığına inanıyorum $array1 + $array2.


3

Yine başka bir örnek (açık anahtarları olmayan diziler; operatörün +ve nasıl çalıştığına dair açıktır array_merge, ancak "açık" şeyler görüldüğünde daha basittir;))

$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));

verecek:

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

0

Lütfen başka bir farka dikkat edin: birleşim (+) boş olmayan değerin üzerine yazmaz (aynı anahtar dikkate alınarak), oysa array_merge:

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

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

Çıktılar :

Array
(
    [foo] => bar
)
Array
(
    [foo] => 0
)

0

Görünüşe göre sırayı değiştirirseniz hem birleştirme hem de birleştirme aynı şeyi yapacak

$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));

Çıktılar :

$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"
}

Dizilerin sırasını aklınızda bulundurun.


Sen sırasını değiştirdi: $a+$bvs $b+$a. Hiçbir şey geçersiz kılınmaz.
ZbyszekKr

Hay aksi, 🤔 @ ZbyszekKr teşekkürler. Bunu nasıl kaçırdım bilmiyorum. Cevabımı tekrar ziyaret edip düzenleyeceğim.
Nedyalko Dyakov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.