2011-03-22 16 views
11

Estoy tratando de intersectar un número arbitrario de matrices PHP, cuyo recuento depende de un parámetro proporcionado por el usuario, cada una de las cuales puede tener cualquier cantidad de elementos.Intersecta un número desconocido de matrices en PHP

Por ejemplo: array1 (1, 2, 3, 4, 5) array2 (2, 4, 6, 8, 9, 23) array3 (a, b, 3, c, f) . .. arrayN (x1, x2, x3, x4, x5 ... xn)

Dado que array_intersect toma una lista de params, no puedo construir una matriz de matrices para intersectar y tengo que trabajar en esto . Intenté esta solución: http://bytes.com/topic/php/answers/13004-array_intersect-unknown-number-arrays pero esto no funcionó, ya que se informó de un error que array_intersect requiere 2 o más params.

¿Alguien tiene alguna idea de cómo abordar esto de la manera más simple posible?

Respuesta

38

crear un nuevo array vacío, añadir cada una de sus matrices para que, a continuación, utilizar call_user_func_array()

$wrkArray = array($userArray1, 
        $userArray2, 
        $userArray3 
       ); 
$result = call_user_func_array('array_intersect',$wrkArray); 
+0

intentado ya que, como se menciona en el enlace en mi pregunta original. Este es el error que recibo: "Advertencia: array_intersect() [function.array-intersect]: se requieren al menos 2 parámetros, 1 dado en ..." – Swader

+0

¡Qué tonto, me olvidé de la parte "_array" de call_user_func! ¡Gracias! – Swader

+1

@swader - es un error fácil de hacer ... no te desanimes demasiado por eso :-) –

4

No utilizar eval()!

Prueba este

$isect = array(); 
for ($i = 1; $i <= $N; $i++) { 
    $isect = array_intersect($isect, ${'array'.$i}); 
} 

o que

$arrays = array() 
for ($i = 1; $i <= $N; $i++) { 
    $arrays[] = ${'array'.$i}; 
} 
$isect = call_user_func_array('array_intersect', $arrays); 
+1

Usa ** $ {'array'. $ i} ** si realmente vas por este camino. – eisberg

+1

@eisberg: thx, actualizado – rik

+0

La primera opción no funciona, porque el resultado se inicializa en una matriz vacía, el resultado de las siguientes intersecciones siempre será una matriz vacía. –

1
$arrays = [ 
    $userArray1, 
    $userArray2, 
    $userArray3 
]; 
$result = array_intersect(...$arrays); 
0

Estoy publicar mi respuesta muy, muy tarde, pero sólo quiero compartir una pequeña pieza de código que me ayuda, en el caso alguien lo necesita para esta pregunta.

print_r(array_intersect(array_merge($array1,$array2,...),$intersectionArr); 

espero que esto ayude a

Gracias

Cuestiones relacionadas