2010-08-17 9 views
12

Tengo 2 matrices que estoy tratando de obtener los valores únicos solo de ellas. Así que no solo estoy tratando de eliminar duplicados, en realidad estoy tratando de eliminar ambos duplicados.Obtener valores únicos de 2 matrices

Así que si estoy recibiendo los 2 arreglos como:

$array1 = array(); 
$array2 = array(); 

foreach($values1 as $value1){ //output: $array1 = 10, 15, 20, 25; 
    $array1[] = $value1; 
} 

foreach($values2 as $value2){ //output: $array2 = 10, 15, 100, 150; 
    $array2[] = $value2; 
} 

La salida final que estoy buscando es

$output = 20, 25, 100, 150; 

Cualquier clara forma de conseguir este hecho?

+0

¿Son esas matrices realmente matrices, o son mapas? Para aclarar mi pregunta, ¿son tus llaves 0,1,2, ... o son palabras y tal? – codersarepeople

+0

@codersarepeople No son mapas de matriz.Son arreglos separados individuales que contienen números. Uno podría ser 3 valores y los otros 10 valores. Simplemente coincidencia de que ambos son 4. – lok

Respuesta

28

Las otras respuestas están en el camino correcto, pero array_diff solo funciona en una dirección, es decir. devuelve los valores que existen en la primera matriz dado que no están en ninguna otra.

Lo que se quiere hacer es conseguir la diferencia en ambas direcciones y luego fusionar las diferencias entre sí:

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 
$output = array_merge(array_diff($array1, $array2), array_diff($array2, $array1)); 
// $output will be (20, 25, 100, 150); 
-1

ver array_diff()

$output = array_diff($array1, $array2); 
+2

Esto no le dará el resultado que espera, porque 'array_diff' solo devuelve los valores que están solo en la primera matriz. Ver mi respuesta para más detalles. –

+2

Esto solo devolverá la diferencia de la matriz 1 a la matriz 2, lo que significa que solo mostrará los elementos de la matriz1 que no existen en la matriz2. Tendría que comparar ambos conjuntos de matrices. –

3

Este es el código para hacerlo. Puede que sea capaz de ser optimizado, pero usted consigue la idea:

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 

$new_array = array(); 
foreach($array1 as $value) { 
    if(!in_array($value, $array2)) { 
     array_push($new_array, $value); 
    } 
} 
foreach($array2 as $value) { 
    if(!in_array($value, $array1)) { 
     array_push($new_array, $value); 
    } 
} 

print_r($new_array); 

Para utilizar array_diff, usted tiene que hacer:

$array1 = array(10, 15, 20, 25); 
$array2 = array(10, 15, 100, 150); 

$out1 = array_diff($array1, $array2); 
$out2 = array_diff($array2, $array1); 
$output = array_merge($out1, $out2); 

print_r($output); 
0

La función array_diff() (manual) se puede utilizar para encontrar la diferencia entre dos matrices:

$array1 = array(10, 20, 40, 80); 
$array2 = array(10, 20, 100, 200); 
$diff = array_diff($array1, $array2); 
// $diff = array(40, 80, 100, 200); 

puede pasar tantos arrays como desee a la función, no se limita sólo a las dos matrices.

+3

Incorrecto: con su código, '$ diff' será' array (40, 80) '. 'array_diff' solo funciona en una dirección. Ver mi respuesta para más detalles. –

6

no menoscabar la respuesta de Daniel Vandersluis, pero a agregar a ella ...

Lo que estás buscando es básicamente una operación XOR de las matrices. Con ese fin, "merlinyoda en dorproject punto net" proporcionó la siguiente rutina, en un comentario sobre http://php.net/manual/en/function.array-diff.php:

<?php 
function array_xor ($array_a, $array_b) { 
    $union_array = array_merge($array_a, $array_b); 
    $intersect_array = array_intersect($array_a, $array_b); 
    return array_diff($union_array, $intersect_array) 
} 
?> 

Esta función toma un enfoque diferente para el cálculo de la XOR.

1

Otra buena solución es la siguiente:

$ array1 = array (10, 15, 20, 25);

$ array2 = array (10, 15, 100, 150);

$ output = array_diff (array_merge ($ array1, $ array2), array_intersect ($ array1, $ array2));

// $ salida será (20, 25, 100, 150);

Cuestiones relacionadas