PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Tückisches array_merge()

with 8 comments

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.

Written by Michael Kliewe

April 18th, 2013 at 8:56 am

Posted in PHP

Tagged with ,

8 Responses to 'Tückisches array_merge()'

Subscribe to comments with RSS or TrackBack to 'Tückisches array_merge()'.

  1. 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

  2. It’s not a bug, it’s a feature ;)

    MrPepperwood

    18 Apr 13 at 09:35

  3. 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

  4. @ 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

  5. @Sebastian ich hab auch die Türkischen Arrays vermutet ..

    John

    18 Apr 13 at 13:34

  6. […] Tückisches array_merge() […]

  7. 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

  8. @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

Leave a Reply

You can add images to your comment by clicking here.