2010-08-17 73 views
12

Tôi có 2 mảng mà tôi đang cố gắng để có được các giá trị duy nhất từ ​​chúng. Vì vậy, tôi không chỉ cố gắng loại bỏ các bản sao, tôi thực sự đang cố gắng xóa cả hai bản sao.Lấy các giá trị duy nhất từ ​​2 mảng

Vì vậy, nếu tôi nhận được 2 mảng như thế này:

$array1 = array(); 
$array2 = array(); 

foreach($values1 as $value1){ //output: $array1 = 10, 15, 20, 25; 
    $array1[] = $value1; 
} 

foreach($values2 as $value2){ //output: $array2 = 10, 15, 100, 150; 
    $array2[] = $value2; 
} 

Kết quả cuối cùng tôi đang tìm là

$output = 20, 25, 100, 150; 

Bất kỳ cách gọn gàng để nhận được này làm gì?

+0

Các mảng đó có thực sự là mảng hay chúng là bản đồ không? Để làm cho câu hỏi của tôi rõ ràng hơn, là chìa khóa của bạn 0,1,2, ... hoặc là họ từ và như vậy? – codersarepeople

+0

@codersarepeople Chúng không phải là bản đồ mảng.Chúng là các mảng riêng biệt chứa các số. Một giá trị có thể là 3 giá trị và 10 giá trị khác. Chỉ trùng hợp ngẫu nhiên rằng cả hai đều là 4. – lok

Trả lời

28

Các câu trả lời khác đang đi đúng hướng, nhưng array_diff chỉ hoạt động theo một hướng - tức là. nó trả về các giá trị tồn tại trong mảng đầu tiên mà không có trong các giá trị khác.

Những gì bạn muốn làm là có được sự khác biệt trong cả hai chiều và sau đó hợp nhất sự khác biệt với nhau:

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 
$output = array_merge(array_diff($array1, $array2), array_diff($array2, $array1)); 
// $output will be (20, 25, 100, 150); 
-1

thấy array_diff()

$output = array_diff($array1, $array2); 
+2

Điều này sẽ không cung cấp cho bạn kết quả bạn mong đợi, bởi vì 'mảng_diff' chỉ trả về các giá trị chỉ trong mảng đầu tiên. Xem câu trả lời của tôi để biết thêm chi tiết. –

+2

Điều này sẽ chỉ trả về sự khác biệt từ mảng 1 đến mảng 2 có nghĩa là nó sẽ chỉ hiển thị các mục từ mảng1 không tồn tại trong mảng2. Bạn sẽ phải so sánh cả hai bộ mảng. –

3

Đây là đoạn mã để làm điều đó. Nó có thể được tối ưu hóa, nhưng bạn sẽ có được ý tưởng:

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 

$new_array = array(); 
foreach($array1 as $value) { 
    if(!in_array($value, $array2)) { 
     array_push($new_array, $value); 
    } 
} 
foreach($array2 as $value) { 
    if(!in_array($value, $array1)) { 
     array_push($new_array, $value); 
    } 
} 

print_r($new_array); 

Để sử dụng array_diff, bạn sẽ phải làm:

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 

$out1 = array_diff($array1, $array2); 
$out2 = array_diff($array2, $array1); 
$output = array_merge($out1, $out2); 

print_r($output); 
0

Các array_diff() (manual) chức năng có thể được sử dụng để tìm ra sự khác biệt giữa hai mảng:

$array1 = array(10, 20, 40, 80); 
$array2 = array(10, 20, 100, 200); 
$diff = array_diff($array1, $array2); 
// $diff = array(40, 80, 100, 200); 

Bạn có thể chuyển nhiều mảng như bạn muốn, không chỉ giới hạn ở hai mảng.

+3

Không chính xác - với mã của bạn, '$ diff' sẽ là' mảng (40, 80) '. 'mảng_diff' chỉ hoạt động theo một hướng. Xem câu trả lời của tôi để biết thêm chi tiết. –

6

Không được làm giảm từ câu trả lời Daniel Vandersluis, nhưng để thêm vào nó ...

Những gì bạn đang tìm kiếm về cơ bản là một hoạt động XOR của các mảng. Cuối cùng, "merlinyoda tại dorproject dot net" cung cấp các thói quen sau đây, trong một bình luận trên http://php.net/manual/en/function.array-diff.php:

<?php 
function array_xor ($array_a, $array_b) { 
    $union_array = array_merge($array_a, $array_b); 
    $intersect_array = array_intersect($array_a, $array_b); 
    return array_diff($union_array, $intersect_array) 
} 
?> 

chức năng này có một cách tiếp cận khác nhau để tính toán XOR.

1

Một giải pháp tốt là thế này:

$ array1 = array (10, 15, 20, 25);

$ array2 = mảng (10, 15, 100, 150);

$ output = array_diff (mảng_merge ($ array1, $ array2), array_intersect ($ array1, $ array2));

// $ đầu ra sẽ là (20, 25, 100, 150);

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