Tückisches array_merge()
Welches Ergebnis würdet ihr erwarten wenn ihr 2 Arrays merged?
$a = array( 'n' => 'n', 'o' => 'o', 'p' => 'p', ); $b = array( 'x' => 'x', 20 => 14, 'z' => 'z', ); $c = array_merge($a, $b);
OK, ich verrate es euch, das Ergebnis sieht so aus:
array(6) { 'n' => string(1) "n" 'o' => string(1) "o" 'p' => string(1) "p" 'x' => string(1) "x" [0] => int(14) 'z' => string(1) "z" }
Beachtenswert ist dabei der Key, der vorher 20 war, ist nun 0. Das ist laut PHP Manual der Funktion array_merge() auch so gewollt, denn numerische Keys werden im Ergebnisarray neu durchnummeriert.
Genau das jedoch verursachte einen netten Bug, denn der Key war in diesem Fall wichtig. Wie können wir nun also 2 oder mehr Arrays zusammenführen und dabei auch die numerischen Keys erhalten? Ganz einfach:
$c = $a + $b;
Der + Operator erstellt genau das Ergebnis das wir wollen. $c sieht nun so aus:
array(6) { 'n' => string(1) "n" 'o' => string(1) "o" 'p' => string(1) "p" 'x' => string(1) "x" [20] => int(14) 'z' => string(1) "z" }
Die 20 ist erhalten geblieben. Bug gefixt.
Wie verhält sich das, wenn ein oder mehrere Keys sowohl in Array $a als auch in Array $b vorhanden sind? Wird dann – wie bei array_merge – der Value des Keys aus dem ersten Array übernommen oder gibt es eine Fehlermeldung oder … ?
Oliver Tasche
18 Apr 13 at 09:33
It’s not a bug, it’s a feature 😉
MrPepperwood
18 Apr 13 at 09:35
Nachtrag: Bei der Überschrift dachte ich zuerst an türkische Arrays .. schien mir Dank T_PAAMAYIM_NEKUDOTAYIM nur logisch …
MrPepperwood
18 Apr 13 at 10:12
@ Oliver Tasche:
der erste Wert wird verwendet (als das genaue Gegenteil zu array_merge):
http://codepad.viper-7.com/OuSuAz
Doku:
http://php.net/manual/en/language.operators.array.php
„The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays, the elements from the left-hand array will be used, and the matching elements from the right-hand array will be ignored.“
Jannik
18 Apr 13 at 10:57
@Sebastian ich hab auch die Türkischen Arrays vermutet ..
John
18 Apr 13 at 13:34
[…] Tückisches array_merge() […]
Linkhub – Woche 16-2013
21 Apr 13 at 21:32
nur mal so, wenn ich über die Zwei-Wege-Facebook-Buttons hovere, sehe ich im aktuellen Chrome keinen Text. Unschön 🙂
Grüße
Nur mal so
28 Jun 13 at 18:18
@Nur mal so: Danke für die Info! Das ist ein WordPress-Plugin, werde den Plugin-Autor mal anschreiben.
Michael Kliewe
29 Jun 13 at 21:37