Một câu hỏi khá đơn giản. Sự khác biệt giữa:
$merged = array_merge($array1, $array2);
và
$merged = $array1 + $array2;
?
Một câu hỏi khá đơn giản. Sự khác biệt giữa:
$merged = array_merge($array1, $array2);
và
$merged = $array1 + $array2;
?
Câu trả lời:
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_merge
chức năng mất đoàn NHƯNG các phím trùng lặp được ghi đè.
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ư +
.
Đâ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 đó.
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.
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_merge
actally 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_merge
cá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'
Tôi tin rằng array_merge
ghi đè các khóa non_numeric trùng lặp trong khi $array1 + $array2
thì không.
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ử +
và array_merge
hoạ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
)
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
)
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.
$a+$b
vs $b+$a
. Không có gì bị ghi đè.