Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inverse of array_intersect()

Tags:

arrays

php

Arguments are like this:

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

and the function should return a array of all elements from arr2, arr3, arr4 ... that don't exist in arr1.

Is there a built in function for this? Or do I need to make it myself with foreach and stuff? :)

like image 535
Alex Avatar asked Dec 04 '11 19:12

Alex


3 Answers

There is no built-in function that does exactly what you are asking for. array_diff() is close, but not quite. So you'll have to roll your own nice neat function or else do something ugly like this:

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

You can remove the call to array_unique() if you want values that appear multiple times in the arrays to also be represented multiple times in your result.

You can remove the calls to array_values() if your keys in your arrays are all numeric or if you are certain that there are no non-numeric keys that appear in more than one of the arrays being merged.

So, in those ideal circumstances, it can be simplified to:

array_diff( array_merge( $arr2, $arr3, $arr4 ), $arr1 );
like image 105
Trott Avatar answered Oct 06 '22 13:10

Trott


You can do this with array_diff, but you'll have to turn things around a bit.

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

EDIT: Trott's answer covers a load of edge cases that mine doesn't. That's probably the best solution you're going to get.

like image 33
GordonM Avatar answered Oct 06 '22 14:10

GordonM


That is what you're looking for :

http://www.php.net/manual/en/function.array-diff.php

like image 1
Imad Moqaddem Avatar answered Oct 06 '22 13:10

Imad Moqaddem