2011-12-04 11 views
5

argumentos son así:Inversa de array_intersect()

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

y la función debe devolver una matriz de todos los elementos de arr2, arr3, arr4 ... que no existen en arr1.

¿Existe una función incorporada para esto? ¿O necesito hacerlo yo mismo con foreach y esas cosas? :)

+2

En la teoría de conjuntos, se llamaría el complemento –

+0

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

Respuesta

10

No hay función incorporada que haga exactamente lo que está pidiendo. array_diff() está cerca, pero no del todo. Por lo que usted tiene que rodar su propia buena función ordenada o bien hacer algo feo como este:

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

Se puede quitar la llamada a array_unique() si desea que los valores que aparecen varias veces en las matrices para también ser representado múltiple veces en tu resultado

Puede eliminar las llamadas a array_values() si sus claves en las matrices son todas numéricas o si está seguro de que no hay claves no numéricas que aparecen en más de una de las matrices que se fusionan.

Por lo tanto, en esas circunstancias ideales, se puede simplificar a:

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

+1 para toda la programación defensiva que no se me ocurrió – GordonM

5

Usted puede hacer esto con array_diff, pero Tendrás que cambiar las cosas un poco.

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

EDITAR: La respuesta de Trott cubre una carga de casos extremos que lo mío no lo hace. Esa es probablemente la mejor solución que obtendrás.