2010-08-17 11 views
12

Ho 2 matrici che sto cercando di ottenere i valori univoci solo da loro. Quindi non sto solo cercando di rimuovere i duplicati, sto effettivamente cercando di rimuovere entrambi i duplicati.Ottenere valori univoci da 2 matrici

Quindi, se sto ottenendo i 2 campi come questo:

$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; 
} 

L'output finale che sto cercando è

$output = 20, 25, 100, 150; 

Qualsiasi modo pulito per ottenere questo fatto?

+0

Questi array sono veramente matrici o sono mappe? Per chiarire la mia domanda, sono le tue chiavi 0,1,2, ... o sono parole e cose del genere? – codersarepeople

+0

@codersarepeople Non sono mappe di array.Sono singoli array separati contenenti numeri. Uno potrebbe essere 3 valori e gli altri 10 valori. Solo una coincidenza che siano entrambi 4. – lok

risposta

28

Le altre risposte sono sulla strada giusta, ma array_diff funziona solo in una direzione, ad es. restituisce i valori che esistono nel primo array dato che non sono in nessun altro.

Che cosa si vuole fare è ottenere la differenza in entrambe le direzioni e quindi unire le differenze tra loro:

$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

vedere array_diff()

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

Questo non ti darà il risultato che ti aspetti, perché 'array_diff' restituisce solo i valori che sono solo nel primo array. Vedi la mia risposta per maggiori dettagli. –

+2

Ciò restituirà la differenza dall'array 1 all'array 2, indicando solo gli elementi dell'array1 che non esistono nell'array2. Dovresti confrontare entrambi i gruppi di array. –

3

Ecco il codice per farlo. Si può essere in grado di essere ottimizzato, ma si ottiene l'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); 

Per utilizzare array_diff, si dovrebbe fare:

$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

L'(manual) funzione array_diff() può essere utilizzata per trovare il differenza tra due array:

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

è possibile passare come molti array come si vuole la funzione, non è solo limitato a due matrici.

+3

errato - con il tuo codice, '$ diff' sarà' array (40, 80) '. 'array_diff' funziona solo in una direzione. Vedi la mia risposta per maggiori dettagli. –

6

Per non sminuire la risposta di Daniel Vandersluis, ma per aggiungere ad essa ...

Quello che stai cercando è fondamentalmente un'operazione XOR degli array. A tal fine, "merlinyoda a dorproject dot net" ha fornito la seguente procedura, in un commento su 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) 
} 
?> 

Questa funzione richiede un approccio diverso per il calcolo del XOR.

1

Un'altra buona soluzione:

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

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

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

// $ l'output sarà (20, 25, 100, 150);

Problemi correlati