Sự khác biệt giữa array_merge và array + array là gì?


Câu trả lời:


73

Sự khác biệt là:

Các +nhà điều hành có sự kết hợp của hai mảng, trong khi array_mergechức năng mất đoàn NHƯNG các phím trùng lặp được ghi đè.


Vì vậy, sự khác biệt giữa 2: array_merge , dấu cộng (mặc dù tôi đã phải chuyển đổi xung quanh các mảng)?
Joseph Silber

15
Một lời cảnh báo cho người mới bắt đầu ở đây, kết quả của phép toán trong cả hai trường hợp là null nếu bất kỳ một trong các mảng là rỗng . Một số có thể không quan tâm đến điều này giả sử vì nó là một phép toán liên hợp, kết quả sẽ là mảng (not-null) thích hợp nếu một trong số chúng là null . Nhưng, điều đó đúng nếu một trong các mảng là mảng trống. Vì vậy, theo tôi là một phương pháp hay, chúng ta nên khởi tạo mảng đầu vào dưới dạng mảng trống. Các bạn nói gì?
Sandeepan Nath

6
Nếu có các khóa trùng lặp, "lấy liên hợp" sẽ luôn phải loại bỏ một trong số chúng. Sự khác biệt là ở cái nào.
alexis

5
Xin lỗi, câu trả lời này khó hiểu, sai và không đầy đủ. : -o Hãy xem bình luận của @ alexis về điều hơi khó hiểu (mặc dù anh ấy cũng chỉ là một nửa sự thật liên quan đến OP). 2. Xem câu trả lời của Yehosef về những gì array_merge thực sự làm ... 3. Và xem câu trả lời của BoltClock về một sự khác biệt quan trọng khác không được đề cập ở đây: array_mergeđặt lại các phím số, không giống như +.
Sz.

không cụ thể chút nào. không hữu dụng. không làm nổi bật sự khác biệt. mức độ giải thích quá cao.
ahnbizcad

90

Đây là một bài kiểm tra minh họa đơn giản:

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

Với kết quả:

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
)

Lưu ý rằng các khóa không phải số trùng lặp sẽ lấy giá trị đầu tiên bằng cách sử dụng toán tử union nhưng giá trị sau sử dụng array_merge.

Đối với các khóa số, giá trị đầu tiên sẽ được sử dụng với toán tử union trong khi tất cả các giá trị sẽ được sử dụng với array_merge, chỉ được lập chỉ mục lại.

Tôi thường sử dụng toán tử union cho mảng kết hợp và array_merge cho số. Tất nhiên, bạn cũng có thể sử dụng array_merge để kết hợp, chỉ là các giá trị sau này sẽ ghi đè các giá trị trước đó.


52

array_merge()khiến tất cả các khóa số được tìm thấy trong mảng đầu vào được lập chỉ mục lại trong mảng kết quả. Toán tử liên hiệp +không gây ra một chỉ mục lại.


29

array_merge so với plus

Nguồn: https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

Ngừng sử dụng array_merge ($ defaults, $ options):

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

   // ...
}

Lưu ý : hàm array_replace tồn tại kể từ PHP5.3.


tại sao chúng ta nên ngừng sử dụng array_merge ($ default, $ options):? bởi vì nó không cho phép các khóa không được lập chỉ mục?
ahnbizcad

nhưng câu trả lời thực sự là didactic +1
snr

20

Dấu + chỉ nhận giá trị từ lần xuất hiện đầu tiên của khóa mảng.
array_merge lấy giá trị từ lần xuất hiện cuối cùng của một khóa mảng.

Thí dụ:

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

Kết quả này cho ra:

dấu cộng
mảng hợp nhất (4) {
["a"] =>
string (3) "one"
["b"] =>
string (3) "two"
["c"] =>
string (5) "three"
[3] =>
string (12) "số ba"
}

array_merge function merge
array (4) {
["a"] =>
string (6) "4th"
["b"] =>
string (5) "5th"
["c"] =>
string (5) "six"
[0] =>
chuỗi (12) "số ba"
}

Đáng lưu ý ở đây là rằng array_mergeactally xóa các '3' chỉ số của vị trí thứ ba mặc dù đó là một chuỗi, bởi vì nó là một con số.

Vì vậy, hãy cẩn thận khi hợp nhất với array_mergecác mảng có chỉ mục số. Họ có thể bị mất chìa khóa. nếu chúng quan trọng đối với bạn, hãy đặt trước chúng bằng một chuỗi.

vì vậy thay vì '3' => 'three'sử dụng một cái gì đó như'_3' => 'three'


5
" Mặc dù đó là một chuỗi, bởi vì nó là một con số " xứng đáng là một 1 :-)
e2-e4

5

Tôi tin rằng array_mergeghi đè các khóa non_numeric trùng lặp trong khi $array1 + $array2thì không.


3

Tuy nhiên, một ví dụ khác (mảng không có khóa rõ ràng; nó rõ ràng về cách toán tử +array_mergehoạt động, nhưng những thứ "hiển nhiên" sẽ đơn giản hơn khi nhìn thấy;))

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

sẽ cho:

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

0

Hãy chú ý đến một sự khác biệt khác: union (+) sẽ không ghi đè giá trị không trống bằng giá trị trống (xem xét cùng một khóa), trong khi array_merge sẽ:

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

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

Kết quả đầu ra:

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

0

Vì vậy, rõ ràng nếu bạn thay đổi thứ tự, cả union và merge sẽ làm điều tương tự

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

Kết quả đầu ra:

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

Hãy ghi nhớ thứ tự của các mảng.


Bạn đã thay đổi theo thứ tự: $a+$bvs $b+$a. Không có gì bị ghi đè.
ZbyszekKr

Rất tiếc, 🤔 @ ZbyszekKr, cảm ơn. Tôi không biết làm thế nào tôi đã bỏ lỡ điều đó. Sẽ xem lại và chỉnh sửa câu trả lời của tôi.
Nedyalko Dyakov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.