Quelle est la différence entre array_merge et array + array?


Réponses:


73

La différence est:

L' +opérateur prend l'union des deux tableaux, alors que la array_mergefonction prend l'union MAIS les clés dupliquées sont écrasées.


Alors, quelle est la différence entre ces 2: array_merge , signe plus (même si j'ai dû basculer entre les tableaux)?
Joseph Silber

15
Un mot d'avertissement pour les débutants ici, le résultat de l'opération dans les deux cas est nul si l'un des tableaux est nul . Certains pourraient ne pas se soucier de cela en supposant qu'il s'agit d'une opération d'union, le résultat sera le tableau approprié (non nul) si l'un d'entre eux est nul . Mais cela est vrai si l'un des tableaux est un tableau vide. Donc, comme bonne pratique, je pense, nous devrions initialiser les tableaux d'entrée en tant que tableaux vides. Que dites-vous les gars?
Sandeepan Nath

6
Si des clés en double «en prenant l'union » toujours avoir à se débarrasser de l' un d'entre eux. La différence est dans laquelle.
alexis

5
Désolé, cette réponse est confuse, fausse et incomplète. : -o Voir le commentaire de @ alexis concernant le peu de confusion (bien que le sien ne soit que la moitié de la vérité concernant l'OP). 2. Voir la réponse de Yehosef sur ce que array_merge fait réellement ... 3. Et voir la réponse de BoltClock sur une autre différence cruciale non mentionnée ici: array_mergeréinitialise les touches numériques, contrairement +.
Sz.

pas du tout spécifique. inutile. ne met pas en évidence la différence. trop haut niveau d’explication.
ahnbizcad

90

Voici un test illustratif simple:

$ar1 = [
   0  => '1-0',
  'a' => '1-a',
  'b' => '1-b'
];


$ar2 = [
   0  => '2-0',
   1  => '2-1',
  'b' => '2-b',
  'c' => '2-c'
];

print_r($ar1+$ar2);

print_r(array_merge($ar1,$ar2));

Avec le résultat:

Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 1-b
  [1] => 2-1
  [c] => 2-c
)
Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 2-b
  [1] => 2-0
  [2] => 2-1
  [c] => 2-c
)

Notez que les clés non numériques en double prendront la première valeur en utilisant l'opérateur union, mais la dernière en utilisant array_merge.

Pour les clés numériques, la première valeur sera utilisée avec l'opérateur union alors que toutes les valeurs seront utilisées avec le array_merge, juste réindexé.

J'utilise généralement l'opérateur union pour les tableaux associatifs et array_merge pour les nombres. Bien sûr, vous pouvez tout aussi bien utiliser array_merge pour associatif, simplement que les dernières valeurs écrasent les précédentes.


52

array_merge()provoque la réindexation de toutes les clés numériques trouvées dans les tableaux d'entrée dans le tableau résultant. L'opérateur union +ne provoque pas de réindexation.



20

Le signe + prend uniquement la valeur de la première occurrence d'une clé de tableau.
array_merge prend la valeur de la dernière occurrence d'une clé de tableau.

Exemple:

$first = ['a'=>'one',
        'b'=>'two',
        'c'=>'three'];

$second = ['a'=>'fourth',
        'b'=>'fifth',
        'c'=>'sixth',
        '3'=>'number three'];

$merged = $first + $second;
echo "<pre> plus sign merge\n";
var_dump($merged);

$merged = array_merge($first,$second);
echo "\n array_merge function merge\n";
var_dump($merged);

Cela produit:

signe plus merge
array (4) {
["a"] =>
string (3) "one"
["b"] =>
string (3) "two"
["c"] =>
string (5) "three"
[3] =>
string (12) "numéro trois"
}

array_merge function merge
array (4) {
["a"] =>
string (6) "quatrième"
["b"] =>
string (5) "cinquième"
["c"] =>
string (5) "sixième"
[0] =>
string (12) "numéro trois"
}

Il est intéressant de noter dans ce que l' array_mergeactally efface l'indice « 3 » du numéro trois , même si elle est une chaîne, car il est un certain nombre.

Faites donc attention lors de la fusion avec des array_mergetableaux avec des index numériques. Ils pourraient perdre leurs clés. s'ils sont importants pour vous, faites-les précéder d'une chaîne.

donc au lieu d' '3' => 'three'utiliser quelque chose comme'_3' => 'three'


5
" même si c'est une chaîne, parce que c'est un nombre " mérite un +1 :-)
e2-e4

5

Je crois qu'il array_mergeécrase les clés non numériques en double alors que ce $array1 + $array2n'est pas le cas.


3

Encore un autre exemple (tableaux sans clés explicites; c'est évident en ce qui concerne la façon dont l'opérateur +et le array_mergetravail, mais les choses "évidentes" sont plus simples quand on les voit;))

$a = array('apple');
$b = array('orange', 'lemon');

echo '$a + $b = ';             print_r($a + $b);
echo 'array_merge($a, $b) = '; print_r(array_merge($a, $b));

va donner:

$a + $b = Array
(
    [0] => apple
    [1] => lemon
)
array_merge($a, $b) = Array
(
    [0] => apple
    [1] => orange
    [2] => lemon
)

0

Veuillez faire attention à une autre différence: l'union (+) n'écrasera pas la valeur non vide par une valeur vide (en considérant une même clé), alors que array_merge:

$a = array('foo' => 'bar');
$b = array('foo' => ''); // or false or 0

print_r($a+$b);
print_r(array_merge($a, $b);

Les sorties :

Array
(
    [foo] => bar
)
Array
(
    [foo] => 0
)

0

Donc, apparemment, si vous changez l'ordre, l'union et la fusion feront la même chose

$a = array('foo' => 'bar', 'x' => 'fromA');
$b = array('foo' => null, 'x' => 'fromB');

echo '$a+$b: ';
var_dump($a+$b);

echo '$b+$a: ';
var_dump($b+$a);

echo 'array_merge($a, $b): ';
var_dump(array_merge($a, $b));

echo 'array_merge($b, $a): ';
var_dump(array_merge($b, $a));

Les sorties :

$a+$b: array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}
$b+$a: array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($a, $b): array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($b, $a): array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}

Gardez à l'esprit l'ordre des tableaux.


Vous avez changé l'ordre: $a+$bvs $b+$a. Rien n'est annulé.
ZbyszekKr

Oups, 🤔 @ ZbyszekKr merci. Je ne sais pas comment j'ai raté ça. Revisitera et modifiera ma réponse.
Nedyalko Dyakov
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.