PHP-Merge-Arrays mit nur NICHT DUPLICATED-Werten

72

Ich muss zwei Arrays zu einem Array zusammenführen, aber ich muss sie entfernen, bevor die Hauptdaten, die sie beide gemeinsam haben (doppelte Werte, meine ich), beim Zusammenführen nur eindeutige Werte benötigen.

Wie kann ich das machen?

Dies ist das Array-Beispiel:

Erstes Array

array(3) { 
    [0]=> object(stdClass)#17 (1) { 
        ["email"]=> string(7) "gffggfg" 
    } 
    [1]=> object(stdClass)#18 (1) { 
        ["email"]=> string(6) "[email protected]" 
    } 
    [2]=> object(stdClass)#19 (1) { 
        ["email"]=> string(6) "wefewf" 
    } 
} 

Zweites Array

array(3) { 
    [0]=> object(stdClass)#17 (1) { 
        ["email"]=> string(7) "[email protected]" 
    } 
    [1]=> object(stdClass)#18 (1) { 
        ["email"]=> string(6) "wefwef" 
    } 
    [2]=> object(stdClass)#19 (1) { 
        ["email"]=> string(6) "wefewf" 
    } 
} 
da ich bin
quelle

Antworten:

183

Sie können die array_merge()Funktion mit der array_unique()Funktion kombinieren (beide Titel sind ziemlich selbsterklärend).

$array = array_unique (array_merge ($array1, $array2));
Jeroen
quelle
Wie ich sehen kann, scheint array_merge () keine Duplikate zu berechnen, daher ist array_unique () in meinem Fall veraltet oder nicht !?
Es ist der
1
array_merge()fügt keine doppelten Schlüssel hinzu, aber wenn Sie doppelte Werte mit unterschiedlichen Schlüsseln haben, werden diese hinzugefügt
Jeroen
wunderbar, ich brauche nur array_merge (), weil ich in allen Arrays immer den gleichen Schlüssel habe, wirklich danke!
Es ist der
1
Erwähnen Sie SORT_REGULAR und andere Optionen, um Fehler beim Konvertieren von Typen zu vermeiden.
Brandon Elliott
4
Hinweis: array_uniquebehält Schlüssel bei, so dass Sie für numerisch indizierte Arrays, wenn Sie sequentielle Schlüssel benötigen, schnell einen neuen Schlüssel eingeben können, indem Sie einen Aufruf anarray_values
highvolt
12

Wenn ich die Frage richtig verstehe:

 $a1 = Array(1,2,3,4);
 $a2 = Array(4,5,6,7);
 $array =  array_diff(array_merge($a1,$a2),array_intersect($a1,$a2));
 print_r($array);

Rückkehr

Array
(
[0] => 1
[1] => 2
[2] => 3
[5] => 5
[6] => 6
[7] => 7
)
Luca Rainone
quelle
Entschuldigung, ich habe vergessen, dass ich ein mehrstufiges Array habe, kein einfaches Array
13.
2

Ich habe einige Benchmarks durchgeführt, wie ich mir das vorstellen kann. Ich habe Tests zum Stapeln vieler Arrays mit 10 bis 20 Zeichenfolgenelementen durchgeführt, was zu einem Array mit allen eindeutigen Zeichenfolgen führte. Dies sollte für das Stapeln von nur 2 Arrays ungefähr gleich sein.

Das schnellste, das ich gefunden habe, war das einfachste, was ich versucht habe.

$uniques = [];
foreach($manyArrays as $arr ) {
  $uniques = array_unique(array_merge($uniques, $arr));
}

Ich hatte dies als "zu naiv zum Arbeiten" eingestuft, da es das eindeutige Array bei jeder Iteration sortieren muss. Dies ist jedoch schneller als jede andere Methode. Testen mit 500.000 Elementen in vielen Arrays, die jeweils 10-20 Zeichenfolgen aus PHP 7.3 enthalten.

Eine knappe Sekunde ist diese Methode, die etwa 10% langsamer ist.

$uniques = [];
foreach($manyArrays as $arr ) {
  foreach($arr as $v) {
    if( !in_array($v, $uniques, false) ) {
      $uniques[] = $v;
    }
  }
}

Die zweite Methode könnte in einigen Fällen besser sein, da dies den Parameter 'strict' von in_array () für die strikte Typprüfung unterstützt. Wenn der Wert auf true gesetzt ist, wird die zweite Option erheblich langsamer als die erste (ca. 40%). Die erste Option unterstützt keine strikte Typprüfung.

Joeri Noort
quelle
1

Schnellere Lösung:

function concatArrays($arrays){
    $buf = [];
    foreach($arrays as $arr){
        foreach($arr as $v){
            $buf[$v] = true;
        }
    }
    return array_keys($buf);
}


$array = concatArrays([$array1, $array2]);
kz_sergey
quelle
3
Wie ist ein verschachtelter Foreach schneller als integrierte Funktionen? Haben Sie Benchmarks?
mcmurphy
-1

Eine etwas späte Antwort, aber ich habe gerade festgestellt, dass der Array Union-Operator +die Arbeit ziemlich gut erledigt ( hier im 3. Abschnitt).

$array1 + $array2 = $array //if duplicate found, the value in $array1 will be considered ($array2 value for array_merge, if keys clearly specified)
Marek N.
quelle
Keine gute Option, um sich zu bewerben! Sie erhalten fehlerhafte Daten, wenn Array KEY gleich ist, auch wenn VALUE unterschiedlich ist, z. B.: $ Array1 = Array ([0] => 0, [1] => 1, [2] => 2) $ array2 = Array ([0 ] => 3) $ array1 + $ array2 = Array ([0] => 0, [1] => 1, [2] => 2) Bessere Option ist array_unique (array_merge ($ array1, $ array2)) = Array ([0] => 0, [1] => 1, [2] => 2, [3] => 3)
Pran
Dies führt nicht zu einer Vereinigung von Array-Werten, siehe php.net
Aurovrata