2010-08-17 20 views
12

Ich habe 2 Arrays, die ich versuche, die eindeutigen Werte nur von ihnen zu erhalten. Also versuche ich nicht nur, Duplikate zu entfernen, ich versuche tatsächlich, beide Duplikate zu entfernen. SoErhalten von eindeutigen Werten von 2 Arrays

wenn ich erhalte die 2-Arrays wie folgt aus:

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

Die letzte Ausgabe, die ich suche ist

$output = 20, 25, 100, 150; 

Jede ordentlich Weg, dies zu tun bekommen?

+0

Sind diese Arrays wirklich Arrays oder sind sie Karten? Um meine Frage klarer zu machen, sind deine Schlüssel 0,1,2, ... oder sind das Wörter und so? – codersarepeople

+0

@codersarepeople Sie sind keine Array-Maps.Sie sind einzelne separate Arrays mit Zahlen. Man könnte 3 Werte und die anderen 10 Werte haben. Nur Zufall, dass sie beide 4 sind. – lok

Antwort

28

Die anderen Antworten sind auf der richtigen Spur, aber array_diff funktioniert nur in einer Richtung - dh. Es gibt die Werte zurück, die in dem ersten Array vorhanden sind, das in keinem anderen Array vorhanden ist.

Was möchten Sie tun ist, den Unterschied in beiden Richtungen und dann die Unterschiede miteinander verschmelzen:

$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

siehe array_diff()

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

Dies gibt Ihnen nicht das Ergebnis, das Sie erwarten, weil 'array_diff' nur die Werte zurückgibt, die nur im ersten Array sind. Siehe meine Antwort für weitere Details. –

+2

Dadurch wird nur der Unterschied von Array 1 zu Array 2 zurückgegeben, was bedeutet, dass nur die Elemente von Array1 angezeigt werden, die nicht in Array2 vorhanden sind. Sie müssten beide Sätze von Arrays vergleichen. –

3

Hier ist der Code, es zu tun. Es kann in der Lage sein, zu optimieren, aber Sie bekommen die Idee:

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

array_diff zu verwenden, würden Sie tun müssen:

$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

Die array_diff() (manual) Funktion verwendet werden kann, die finden Differenz zwischen zwei Feldern:

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

Sie so viele Felder passieren können, wie Sie auf die Funktion möchten, ist es nicht nur auf zwei Arrays beschränkt.

+3

Falsch - mit Ihrem Code wird '$ diff' zu' array (40, 80) '. 'array_diff' funktioniert nur in einer Richtung. Siehe meine Antwort für weitere Details. –

6

Nicht von Daniel Vandersluis Antwort auf ablenken, sondern um es hinzuzufügen ...

Was Sie suchen, ist im Grunde eine XOR-Operation der Arrays. Zu diesem Zweck „merlinyoda an dorproject dot net“ zur Verfügung gestellt, die folgenden Routine, in einem Kommentar zu 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) 
} 
?> 

Diese Funktion nimmt einen anderen Ansatz, um die XOR zu berechnen.

1

andere gute Lösung ist folgende:

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

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

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

// $ Ausgabe wird sein (20, 25, 100, 150);

Verwandte Themen