2010-04-16 48 views
38

Gần đây tôi đã học cách tham gia 2 mảng bằng cách sử dụng toán tử + trong PHP.Không thể nối hai mảng trong PHP

Nhưng xem xét mã này ...

$array = array('Item 1'); 

$array += array('Item 2'); 

var_dump($array); 

Output là

mảng (1) {[0] => string (6) "Item 1"}

Tại sao tính năng này không hoạt động? Bỏ qua viết tắt và sử dụng $array = $array + array('Item 2') cũng không hoạt động. Nó có liên quan đến chìa khóa không?

+0

* (liên quan) * http://stackoverflow.com/questions/2140090/operator-for-array-in-php/2140094#2140094 – Gordon

Trả lời

88

Cả hai sẽ có khóa là 0 và phương pháp kết hợp các mảng đó sẽ thu gọn các bản sao. Hãy thử sử dụng array_merge() để thay thế.

$arr1 = array('foo'); // Same as array(0 => 'foo') 
$arr2 = array('bar'); // Same as array(0 => 'bar') 

// Will contain array('foo', 'bar'); 
$combined = array_merge($arr1, $arr2); 

Nếu các phần tử trong mảng của bạn sử dụng các khóa khác nhau, toán tử + sẽ phù hợp hơn.

$arr1 = array('one' => 'foo'); 
$arr2 = array('two' => 'bar'); 

// Will contain array('one' => 'foo', 'two' => 'bar'); 
$combined = $arr1 + $arr2; 

Chỉnh sửa: Thêm một đoạn mã để làm rõ

+12

Lưu ý rằng hàm array_merge sẽ vẫn thu gọn các bản sao của các khóa mảng không phải là số. ví dụ array_merge (mảng ("color" => "red"), mảng ("color" => "green")) sẽ tạo ra giá trị của mảng ("color" => "green); –

+0

$ arr1 = array (' foo '); // Giống như mảng (0 =>' foo ') $ arr2 = mảng (' bar '); // Giống như mảng (0 =>' bar ') // Sẽ chứa mảng (' bar '); $ combined = array_merge ($ arr1, $ arr2); –

-3

Hãy thử nói

$array[] = array('Item 2'); 

Mặc dù có vẻ như bạn đang cố gắng để thêm một mảng thành một mảng, do đó $array[][] nhưng đó không phải là những gì tiêu đề của bạn gợi ý.

+2

Không giống nhau. Bạn sẽ nhận được 'mảng ('Mục 1', mảng ('Mục 2'))', một mảng đa chiều. – deceze

+1

Đúng, đó là điều tôi nghĩ anh ấy muốn. –

7

Sử dụng array_merge()
Xem tài liệu ở đây:
http://php.net/manual/en/function.array-merge.php

Kết hợp các yếu tố của một hoặc nhiều mảng với nhau để các giá trị của một được nối vào cuối của trước đó. Nó trả về mảng kết quả.

3

Hãy thử array_merge.

$array1 = array('Item 1'); 

$array2 = array('Item 2'); 

$array3 = array_merge($array1, $array2); 

Tôi nghĩ rằng nó bởi vì bạn không gán một chìa khóa để một trong hai, vì vậy cả hai đều có chìa khóa từ 0, và + không tái lập chỉ mục, vì vậy cố gắng của nó đến hơn viết nó.

2
$array = array('Item 1'); 

array_push($array,'Item 2'); 

hoặc

$array[] = 'Item 2'; 
6

+ được gọi là các nhà điều hành Liên minh, mà khác với một nhà điều hành Concatenation (PHP không có một cho mảng). Các description rõ ràng nói:

Toán tử + nối thêm các phần còn lại từ tay phải sang tay trái, trong khi các phím trùng lặp không được ghi đè.

Với ví dụ:

$a = array("a" => "apple", "b" => "banana"); 
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry"); 
$c = $a + $b; 

array(3) { 
    ["a"]=> 
    string(5) "apple" 
    ["b"]=> 
    string(6) "banana" 
    ["c"]=> 
    string(6) "cherry" 
} 

Kể từ khi cả hai mảng của bạn có một entry với phím 0, kết quả dự kiến.

Để nối, sử dụng array_merge.

2

Nó thực sự là một xung đột chính. Khi ghép các mảng, các khóa trùng lặp sẽ không bị ghi đè.

Thay vào đó bạn phải sử dụng array_merge()

$array = array_merge(array('Item 1'), array('Item 2')); 
6

Tất cả các câu trả lời trước là không chính xác! hợp nhất thực sự hợp nhất các mảng, có nghĩa là, nếu các mảng có một mục chung thì một trong các bản sao sẽ bị bỏ qua. Tương tự, hãy đi theo số công đoàn.

tôi không tìm thấy một "công việc xung quanh" cho vấn đề này, nhưng để thực sự làm điều đó bằng tay ...

đây nó đi:

<?php 
$part1 = array(1,2,3); 
echo "array 1 = \n"; 
print_r($part1); 
$part2 = array(4,5,6); 
echo "array 2 = \n"; 
print_r($part2); 
$ans = NULL; 
for ($i = 0; $i < count($part1); $i++) { 
    $ans[] = $part1[$i]; 
} 
for ($i = 0; $i < count($part2); $i++) { 
    $ans[] = $part2[$i]; 
} 
echo "after arrays concatenation:\n"; 
print_r($ans); 
?> 
+12

Điều này là sai. 'array_merge' sẽ chỉ bỏ qua các mục từ mảng kết quả nếu chúng là mảng _associative_ với cùng các khóa. sáp nhập vào một mảng mới, có độ dài là tổng chính xác của các mảng ban đầu Trong ví dụ bạn đang sử dụng mảng số, có nghĩa là 'array_merge' sẽ hoạt động hoàn hảo cho bạn. Tôi đồng ý rằng' array_merge' không nên được sử dụng cho mảng kết hợp, nhưng rõ ràng đó không phải là những gì bạn đang hiển thị ở đây . – JMTyler

+0

@JMTyler +1 nhận xét tuyệt vời! Tôi nên chọn một ví dụ sử dụng mảng kết hợp. Lý do chính tôi đăng câu trả lời này là câu trả lời được chấp nhận sử dụng '+' không nên được sử dụng trong cả hai trường hợp (kết hợp hay không) trừ khi các phím khác nhau. Và array_merge sẽ chứa các mục trùng lặp trong trường hợp các mục giống nhau. – alfasin

+1

"Tất cả các câu trả lời trước đó là không chính xác" không hữu ích vì các câu trả lời được sắp xếp lại tùy thuộc vào phiếu bầu. –

-5

bạn có thể sử dụng toán tử. $ array3 = $ array1. $ Array2;

+2

Đó là một toán tử concat. Bạn sẽ kết thúc với một vài thông báo và "ArrayArray". –

Các vấn đề liên quan