$test = array('hi');
$test += array('test','oh');
var_dump($test);
Điều gì có +
nghĩa cho mảng trong PHP?
array_merge
? Như thể các mảng theo mặc định là mảng kết hợp và mảng số là công dân hạng hai.
$test = array('hi');
$test += array('test','oh');
var_dump($test);
Điều gì có +
nghĩa cho mảng trong PHP?
array_merge
? Như thể các mảng theo mặc định là mảng kết hợp và mảng số là công dân hạng hai.
Câu trả lời:
Trích dẫn từ Hướng dẫn PHP về Người vận hành Ngôn ngữ
Toán tử + trả về mảng bên phải được gắn vào mảng bên trái; đối với các khóa tồn tại trong cả hai mảng, các phần tử từ mảng bên trái sẽ được sử dụng và các phần tử phù hợp từ mảng bên phải sẽ bị bỏ qua.
Vì vậy, nếu bạn làm
$array1 = ['one', 'two', 'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz'];
print_r($array1 + $array2);
Bạn sẽ nhận được
Array
(
[0] => one // preserved from $array1 (left-hand array)
[1] => two // preserved from $array1 (left-hand array)
[foo] => bar // preserved from $array1 (left-hand array)
[2] => five // added from $array2 (right-hand array)
)
Vì vậy, logic của +
tương đương với đoạn mã sau:
$union = $array1;
foreach ($array2 as $key => $value) {
if (false === array_key_exists($key, $union)) {
$union[$key] = $value;
}
}
Nếu bạn quan tâm đến các chi tiết của đầu triển khai cấp độ C
Lưu ý, +
khác với cách array_merge()
kết hợp các mảng:
print_r(array_merge($array1, $array2));
sẽ cung cấp cho bạn
Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[foo] => baz // overwritten from $array2
[2] => three // appended from $array2
[3] => four // appended from $array2
[4] => five // appended from $array2
)
Xem các trang được liên kết để biết thêm ví dụ.
+
và array_merge
cuộc gọi zend_hash_merge
dưới mui xe. Điều này cũng được mong đợi, vì trong mảng PHP được triển khai dưới dạng bản đồ băm theo thứ tự.
+
và array_merge
là đồi trụy và không trực quan. Chúng ngược lại so với những gì mà một bài đọc tiếng Anh đơn giản sẽ trực giác cho bạn biết các mảng 'thêm' hoặc 'hợp nhất' sẽ làm gì. Các ngôn ngữ / thư viện khác sử dụng +
để ghép các danh sách (ví dụ như trong Python) và các hàm "hợp nhất" để thêm các cặp khóa / giá trị từ một đối tượng này sang đối tượng khác (ví dụ như trong lodash). Tuy nhiên, trong PHP thì ngược lại; array_merge
có thể được sử dụng để nối các mảng giống như danh sách nhưng +
không thể. Không giống như array_merge
, +
luôn luôn thực hiện thao tác được gọi là "hợp nhất" trong bất kỳ ngôn ngữ nào khác.
Ví dụ tốt nhất tôi tìm thấy để sử dụng này là trong một mảng cấu hình.
$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"no-reply@domain.com");
$config = $user_vars + $default_vars;
Các $default_vars
, vì nó gợi ý, là mảng cho các giá trị mặc định. Các $user_vars
mảng sẽ ghi đè lên các giá trị quy định tại $default_vars
. Bất kỳ giá trị thiếu nào trong $user_vars
bây giờ là các giá trị mặc định từ $default_vars
.
Điều này sẽ print_r
như:
Array(2){
"username" => "John Doe",
"email" => "no-reply@domain.com"
}
Tôi hi vọng cái này giúp được!
Toán tử này lấy liên kết của hai mảng (giống như mảng_merge, ngoại trừ việc có các khóa trùng lặp mảng_merge được ghi đè).
Các tài liệu cho các nhà khai thác mảng được tìm thấy ở đây .
Cẩn thận với các phím số, nếu chúng nên được bảo quản hoặc nếu bạn không muốn mất bất cứ thứ gì
$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");
liên hiệp
print_r($a+$b);
Array
(
[2] => a2
[4] => a4
[5] => a5
[1] => b1
[3] => b3
)
hợp nhất
print_r(array_merge($a, $b));
Array
(
[0] => a2
[1] => a4
[2] => a5
[3] => b1
[4] => b3
[5] => b4
)
Các +
nhà điều hành sản xuất các kết quả tương tự như array_replace () . Tuy nhiên, vì các đối số toán tử được đảo ngược, thứ tự của mảng kết quả cũng có thể khác nhau.
Mở rộng trên một ví dụ khác từ trang này:
$array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz');
print_r($array1 + $array2);
print_r(array_replace($array2, $array1)); //note reversed argument order
đầu ra:
Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[foo] => bar // preserved from $array1
[2] => five // added from $array2
)
Array
(
[0] => one // preserved from $array1
[1] => two // preserved from $array1
[2] => five // added from $array2
[foo] => bar // preserved from $array1
)
+
được đảm bảo bởi thông số kỹ thuật? Thế còn array_replace
?
- Mảng hoạt động cộng với coi tất cả các mảng là mảng PGS.
- Khi xung đột khóa trong khi cộng, giá trị bên trái (trước) sẽ được giữ
Tôi gửi mã dưới đây để làm cho mọi thứ rõ ràng.
$a + $b = array_plus($a, $b)
function array_plus($a, $b){
$results = array();
foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
return $results;
}
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);
Mảng ([0] => ví dụ [1] => kiểm tra)
+=
và câu trả lời được chấp nhận+
. Từ thử nghiệm của tôi, họ dường như cư xử giống nhau.