Kết hợp hai mảng


88

Tôi có hai mảng như thế này:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

Tôi muốn kết hợp hai mảng này để nó không chứa bản sao và cũng như giữ các khóa ban đầu của chúng. Ví dụ đầu ra phải là:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

Tôi đã thử điều này nhưng nó đang thay đổi các khóa ban đầu của họ:

$output = array_unique( array_merge( $array1 , $array2 ) );

Bất kì giải pháp nào?

Câu trả lời:


161

Chỉ dùng:

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

Điều đó sẽ giải quyết nó. Bởi vì bạn sử dụng các khóa chuỗi nếu một khóa xuất hiện nhiều lần (như '44'trong ví dụ của bạn), một khóa sẽ ghi đè các khóa thủ tục có cùng tên. Bởi vì trong trường hợp của bạn, cả hai đều có cùng giá trị, điều đó không quan trọng và nó cũng sẽ loại bỏ các bản sao.

Cập nhật: Tôi vừa nhận ra rằng PHP xử lý các phím chuỗi số là số (số nguyên) và vì vậy sẽ hoạt động như thế này, nghĩa là nó cũng đánh số lại các khóa ...

Một cách giải quyết là tạo lại các phím.

$output = array_combine($output, $output);

Cập nhật 2: Tôi luôn quên rằng cũng có một toán tử (được in đậm, bởi vì đây thực sự là những gì bạn đang tìm kiếm!: D)

$output = $array1 + $array2;

Tất cả những điều này có thể được nhìn thấy trong: http://php.net/manual/en/ Chức năng.array-merge.php


5
@KingCrunch - Mặc dù các số được trích dẫn nhưng đó không phải là các khóa chuỗi và do đó chỉ mục sẽ không được giữ nguyên. Ví dụ: Ideone.com/I2NFT
Brendan Bullen

1
Thực sự ... Đầu tiên tôi muốn nói về "một lỗi", nhưng sau đó tôi nhận thấy rằng sách hướng dẫn chỉ nói về "phím số", không phải "phím số nguyên". Cảm thấy hơi khó hiểu.
KingCrunch

+1 Tôi đã quên về nhà điều hành! Xuất sắc (viết đậm phần đó
!;

3
Vậy $array1 + $array2là giải pháp ngắn gọn và hiệu quả thay vì array_merge() - array_combine()kết hợp
Awan

2
CẢNH BÁO! cho các mảng không phải assoc hoặc nếu các mảng có các khóa chung$a + $b != array_merge($a, $b)
jmarceli

33

Bạn nên xem xét rằng $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1',
'22' => 'x1' 
);  

$array2 = array(
'22' => 'x2',
'33' => 'x2' 
);

với $ array1 + $ array2

$array1 + $array2 = array(
'11' => 'x1',
'22' => 'x1',
'33' => 'x2'
);

và với $ array2 + $ array1

$array2 + $array1 = array(  
'11' => 'x1',  
'22' => 'x2',  
'33' => 'x2'  
);

25

Những công việc này:

$output = $array1 + $array2;

12
Tôi sẽ không khuyên bạn điều này bởi vì hành vi của nó là rất unintuitive, ví dụ:[1,2,3] + [4,5,6] == [1,2,3]
jchook

@jchook Bạn khuyên bạn nên làm gì?
Michas

Đây là những gì tôi cần, cảm ơn. Đây là lý do tại sao: http_build_query(array_merge($array1, $array2))không hiệu quả với tôi, ngược lại http_build_query($array1 + $array2).
BarryMode

4

Để làm điều này, bạn có thể lặp qua một cái và nối vào cái kia:

<?php

$test1 = array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

$test2 = array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);


function combineWithKeys($array1, $array2)
{
    foreach($array1 as $key=>$value) $array2[$key] = $value;
    asort($array2);
    return $array2;
} 

print_r(combineWithKeys($test1, $test2));

?>

CẬP NHẬT: KingCrunch đã đưa ra giải pháp tốt nhất :print_r($array1+$array2);


2

Nếu bạn đang sử dụng PHP 7.4 trở lên, bạn có thể sử dụng toán tử spread ...như các ví dụ sau từ Tài liệu PHP:

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

Nó hoạt động giống như trong JavaScript ES6.

Xem thêm trên https://wiki.php.net/rfc/spread_operator_for_array .


Điều này không áp dụng cho câu hỏi. OP có các khóa chuỗi cho mảng (Điều đó không hoạt động với toán tử dàn trải) và OP muốn giữ lại các khóa (toán tử
dàn

Ồ, tôi thấy điểm của bạn. Đó là sự thật, và bạn đúng. Bạn có thể cung cấp một số mã để giúp chúng tôi cải thiện câu trả lời của tôi cho người khác không? Tôi đánh giá cao thời gian của bạn! Cảm ơn bạn rất nhiều vì đã chỉ ra những hạn chế trong câu trả lời của tôi.
Sinh viên Khoa học

Tôi không nghĩ rằng nhà điều hành spread là cách để đi đến đây. Thay vào đó, hãy sử dụng câu trả lời đã cho$array1 + $array2
martti

Tôi đã không biết về điều này! Ý tôi là, tôi không biết rằng chúng ta có thể làm được $ouput = $array1 + $array2. Bây giờ tôi đã học được một cái gì đó mới! Cảm ơn bạn!
Sinh viên Khoa học

1

Những công việc này:

$a = array(1 => 1, 2 => 2, 3 => 3);
$b = array(4 => 4, 5 => 5, 6 => 6);
$c = $a + $b;
print_r($c);

1

Cảnh báo! $ array1 + $ array2 ghi đè các khóa, vì vậy giải pháp của tôi (đối với mảng nhiều chiều) là sử dụng array_unique ()

array_unique(array_merge($a, $b), SORT_REGULAR);

Để ý:

5.2.10+ Đã thay đổi giá trị mặc định củasort_flags trở lại thành SORT_STRING.

5.2.9 Mặc định là SORT_REGULAR.

5.2.8- Mặc định là SORT_STRING

hoạt động hoàn hảo . Hy vọng nó sẽ giúp giống nhau.


1
array_merge()không bảo quản các phím mặc dù. Mảng được tạo bởi đó là 0 được lập chỉ mục.
HPierce

@ HPierce tốt, trong trường hợp thêm mảng nhiều chiều, một số thông tin sẽ bị mất khi sử dụng +. Hãy xem: PHPFiddle , $ b [0] sẽ bị mất ...
Norman Edance

1

Cách mới để thực hiện với php7.4 là toán tử Spread [...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

Toán tử spread phải có hiệu suất tốt hơn array_merge

Một ưu điểm đáng kể của toán tử Spread là nó hỗ trợ mọi đối tượng có thể duyệt qua, trong khi hàm array_merge chỉ hỗ trợ mảng.


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.