Kombinieren Sie zwei Arrays

87

Ich habe zwei Arrays wie dieses:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

Ich möchte diese beiden Arrays so kombinieren, dass sie keine Duplikate enthalten, und ihre ursprünglichen Schlüssel behalten. Zum Beispiel sollte die Ausgabe sein:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

Ich habe es versucht, aber es ändert ihre ursprünglichen Schlüssel:

$output = array_unique( array_merge( $array1 , $array2 ) );

Irgendeine Lösung?

Awan
quelle

Antworten:

158

Benutz einfach:

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

Das sollte es lösen. Da Sie Zeichenfolgenschlüssel verwenden, wenn ein Schlüssel mehr als einmal vorkommt (wie '44'in Ihrem Beispiel), überschreibt ein Schlüssel prozedurale Schlüssel mit demselben Namen. Da in Ihrem Fall beide sowieso den gleichen Wert haben, spielt es keine Rolle und es werden auch Duplikate entfernt.

Update: Ich habe gerade festgestellt, dass PHP die numerischen String-Schlüssel als Zahlen (Ganzzahlen) behandelt und sich so verhält, was bedeutet, dass es auch die Schlüssel neu nummeriert ...

Eine Problemumgehung besteht darin, die Schlüssel neu zu erstellen.

$output = array_combine($output, $output);

Update 2: Ich vergesse immer, dass es auch einen Operator gibt (fett gedruckt, denn das ist wirklich das, wonach Sie suchen !: D)

$output = $array1 + $array2;

All dies kann unter http://php.net/manual/en/function.array-merge.php eingesehen werden

KingCrunch
quelle
5
@KingCrunch - Obwohl die Zahlen in Anführungszeichen gesetzt sind, handelt es sich nicht um Zeichenfolgenschlüssel, sodass der Index nicht beibehalten wird. Beispiel: ideone.com/I2NFT
Brendan Bullen
1
Wirklich ... Zuerst wollte ich über "einen Fehler" sprechen, aber dann bemerkte ich, dass das Handbuch nur über "Zifferntasten" spricht, nicht über "Ganzzahlschlüssel". Fühlt sich ein bisschen verwirrend an.
KingCrunch
+1 Ich habe den Operator vergessen! Ausgezeichnet (setzen Sie diesen Teil in Fettdruck !;))
Brendan Bullen
3
So $array1 + $array2ist kurze und effiziente Lösung statt array_merge() - array_combine()Kombination
Awan
2
WARNUNG! für Nicht-Assoc-Arrays oder wenn Arrays gemeinsame Schlüssel haben$a + $b != array_merge($a, $b)
jmarceli
33

Sie sollten dies berücksichtigen $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1',
'22' => 'x1' 
);  

$array2 = array(
'22' => 'x2',
'33' => 'x2' 
);

mit $ array1 + $ array2

$array1 + $array2 = array(
'11' => 'x1',
'22' => 'x1',
'33' => 'x2'
);

und mit $ array2 + $ array1

$array2 + $array1 = array(  
'11' => 'x1',  
'22' => 'x2',  
'33' => 'x2'  
);
inemanja
quelle
25

Das funktioniert:

$output = $array1 + $array2;
Michas
quelle
12
Ich würde dies nicht empfehlen, da sein Verhalten sehr unintuitiv ist, zB[1,2,3] + [4,5,6] == [1,2,3]
jchook
@jchook Was empfehlen Sie dann?
Michas
Das habe ich gebraucht, danke. Hier ist der Grund: http_build_query(array_merge($array1, $array2))hat bei mir nicht funktioniert, wohingegen http_build_query($array1 + $array2).
BarryMode
4

Dazu können Sie eine Schleife durchlaufen und an die andere anhängen:

<?php

$test1 = array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

$test2 = array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);


function combineWithKeys($array1, $array2)
{
    foreach($array1 as $key=>$value) $array2[$key] = $value;
    asort($array2);
    return $array2;
} 

print_r(combineWithKeys($test1, $test2));

?>

UPDATE: KingCrunch hat die beste Lösung gefunden :print_r($array1+$array2);

Brendan Bullen
quelle
2

Wenn Sie PHP 7.4 oder höher verwenden, können Sie den Spread-Operator ...als folgende Beispiele aus den PHP-Dokumenten verwenden:

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

Es funktioniert wie in JavaScript ES6.

Weitere Informationen finden Sie unter https://wiki.php.net/rfc/spread_operator_for_array .

Student der Naturwissenschaften
quelle
Dies gilt nicht für die Frage. Das OP hat String-Schlüssel für das Array (das funktioniert nicht mit dem Spread-Operator) und das OP möchte die Schlüssel beibehalten (der Spread-Operator wirft die Schlüssel weg). Auch OP möchte keine Duplikate.
Martti
Oh, ich sehe deine Punkte. Das stimmt und du hast recht. Können Sie einen Code bereitstellen, der uns hilft, meine Antwort für andere Personen zu verbessern? Ich würde mich über Ihre Zeit freuen! Vielen Dank, dass Sie auf die Nachteile meiner Antwort hingewiesen haben.
Student of Science
Ich denke nicht, dass der Spread-Operator der richtige Weg ist. Verwenden Sie stattdessen die angegebene Antwort$array1 + $array2
Martti
Das war mir nicht bewusst! Ich wusste nicht, dass wir das können $ouput = $array1 + $array2. Jetzt habe ich etwas Neues gelernt! Danke dir!
Student of Science
1

Das funktioniert:

$a = array(1 => 1, 2 => 2, 3 => 3);
$b = array(4 => 4, 5 => 5, 6 => 6);
$c = $a + $b;
print_r($c);
Jeni
quelle
1

Warnung! $ array1 + $ array2 überschreibt Schlüssel, daher besteht meine Lösung (für mehrdimensionale Arrays) darin, array_unique () zu verwenden.

array_unique(array_merge($a, $b), SORT_REGULAR);

Beachten:

5.2.10+ Der Standardwert von sort_flagsback wurde in SORT_STRING geändert.

5.2.9 Standard ist SORT_REGULAR.

5.2.8- Standard ist SORT_STRING

Es funktioniert perfekt . Hoffe es hilft gleich.

Norman Edance
quelle
1
array_merge()Die Schlüssel bleiben jedoch nicht erhalten. Das dadurch erstellte Array ist 0 indiziert.
HPierce
@HPierce Nun, im Fall der mehrdimensionalen Arrayaddition gehen einige Informationen mit verloren +. Schauen Sie sich an: PHPFiddle , $ b [0] geht verloren ...
Norman Edance
1

Die neue Methode mit php7.4 ist der Spread-Operator [...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

Der Spread-Operator sollte eine bessere Leistung haben als array_merge

Ein wesentlicher Vorteil des Spread-Operators besteht darin, dass er alle durchlaufbaren Objekte unterstützt, während die Funktion array_merge nur Arrays unterstützt.

Shoaib Ahmed
quelle