2010-02-21 10 views
38

tengo 2 arrays, el valor será cargada desde la base de datos, a continuación se muestra un ejemplo:¿Cómo puedo usar in_array si la aguja es una matriz?

$arr1 = array(1,2,3); 
$arr2 = array(1,2,3,4,5,6,7); 

Lo que quiero hacer es comprobar si existen todos los valores en $arr1 en $arr2. El ejemplo anterior debe ser un TRUE mientras:

$arr3 = array(1,2,4,5,6,7); 

comparando $arr1 con $arr3 devolverá un FALSE.

Normalmente utilizo in_array porque solo necesito verificar el valor individual en una matriz. Pero en este caso, in_array no se puede utilizar. Me gustaría ver si hay una manera simple de hacer la verificación con un bucle mínimo.

ACTUALIZACIÓN para aclaración.

Primera matriz será un conjunto que contiene valores únicos. La segunda matriz puede contener valores duplicados. Ambas tienen garantizada una matriz antes del procesamiento.

+0

Puede valer la pena aclarar: ¿Está buscando la semántica "set" normal? ¿Qué resultado esperarías si la segunda matriz fuera una matriz (1,2,4,3)? ¿Qué pasa si el primero era una matriz (1,1,1,1)? ¿O son ilegales? – Oddthinking

Respuesta

58

Uso array_diff():

$arr1 = array(1,2,3); 
$arr2 = array(1,2,3,4,5,6,7); 
$arr3 = array_diff($arr1, $arr2); 
if (count($arr3) == 0) { 
    // all of $arr1 is in $arr2 
} 
+0

+1 por señalarme a la función 'array_diff()' y dar ejemplo de uso. –

5

Puede intentar utilizar la función array_diff() para encontrar la diferencia entre las dos matrices, esto podría ayudarlo. Creo que para aclarar lo que quiere decir, todos los valores en la primera matriz deben estar en la segunda matriz, pero no al revés.

+0

Sí Sam. Todos los valores '$ arr1' deben aparecer en la segunda matriz, para obtener una condición' TRUE'; de lo contrario, 'FALSE'. Voy a echar un vistazo al 'array_diff()'. Gracias –

27

Puede utilizar array_intersect o array_diff:

$arr1 = array(1,2,3); 
$arr2 = array(1,2,3,4,5,6,7); 

if ($arr1 == array_intersect($arr1, $arr2)) { 
    // All elements of arr1 are in arr2 
} 

Sin embargo, si usted no necesita utilizar el resultado de la intersección (que parece ser su caso), es más espacio y tiempo eficiente para usar array_diff:

$arr1 = array(1,2,3); 
$arr2 = array(1,2,3,4,5,6,7); 
$diff = array_diff($arr1, $arr2); 

if (empty($diff)) { 
    // All elements of arr1 are in arr2 
} 
+0

+1 para las funciones apuntadas a 'array_intersect()' y dando el ejemplo de uso. –

0

En mi caso particular, necesitaba verificar si un par de identificadores se procesaron antes o no. Tan simple array_diff() no funcionó para mí.

En lugar de eso genera claves de los identificadores ordenados alfabéticamente y las utiliza con in_array:

<?php 
$pairs = array(); 
// ... 
$pair = array($currentId, $id); 
sort($pair); 
$pair = implode('-', $pair); 
if (in_array($pair, $pairs)) { 
    continue; 
} 
$pairs[$pair] = $pair; 

Esto probablemente no es una solución óptima en absoluto, sino que sólo necesitaba para una escritura sucia para ser ejecutado una vez.

Cuestiones relacionadas