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 Juni 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 Juni 13 at 21:37