2011-12-04 23 views
5

Các đối số có như thế này:Inverse của array_intersect()

function foo(arr1, arr2, arr3, arr4 ...) 

và chức năng phải trả lại một mảng của tất cả các yếu tố từ arr2, arr3, arr4 ... không tồn tại trong arr1.

Có chức năng tích hợp sẵn không? Hay tôi cần phải tự làm cho mình với foreach và các thứ? :)

+2

Trong lý thuyết tập hợp, nó sẽ được gọi là bổ sung –

+0

dup? http://stackoverflow.com/questions/5582242/opposite-of-array-intersect – Geo

Trả lời

10

Không có chức năng tích hợp nào thực hiện chính xác những gì bạn đang yêu cầu. array_diff() là gần, nhưng không hoàn toàn. Vì vậy, bạn sẽ cần phải cuộn chức năng gọn gàng đẹp của riêng bạn hoặc ai khác làm điều gì đó xấu xí như thế này:

array_diff(array_unique(
       array_merge(
        array_values($arr2), 
        array_values($arr3), 
        array_values($arr4) 
       )), 
       $arr1 
      ); 

Bạn có thể loại bỏ các cuộc gọi đến array_unique() nếu bạn muốn giá trị xuất hiện nhiều lần trong các mảng cũng được đại diện nhiều số lần trong kết quả của bạn.

Bạn có thể xóa các cuộc gọi đến array_values() nếu các khóa trong các mảng của bạn đều là số hoặc nếu bạn chắc chắn rằng không có khóa không phải là số xuất hiện trong nhiều hơn một mảng được hợp nhất.

Vì vậy, trong những tình huống lý tưởng, nó có thể được đơn giản hóa để:

array_diff(array_merge($arr2, $arr3, $arr4), $arr1); 
+0

+1 cho tất cả các chương trình phòng thủ không xảy ra với tôi – GordonM

5

Bạn có thể làm điều này với array_diff, nhưng bạn sẽ phải xoay mọi thứ một chút.

$result = array_diff (array_merge ($arr2, $arr3, $arr4), $arr1); 

EDIT: Câu trả lời của Trott bao gồm một tải trọng của trường hợp cạnh đó tôi không. Đó có lẽ là giải pháp tốt nhất bạn sẽ nhận được.

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