Menu

PHP array_merge() : fusionner deux tableaux ou plus

array_merge($a, $b) réunit des tableaux en un seul : les valeurs à clés numériques sont ajoutées et renumérotées, et pour les clés de type chaîne le dernier tableau l'emporte. En quoi array_merge diffère de l'opérateur + et de la syntaxe [...$a, ...$b], comment fusionner une liste de tableaux, et quand array_merge_recursive ou array_replace conviennent mieux.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

array_merge($a, $b) renvoie un nouveau tableau avec les éléments de $a suivis de ceux de $b. Les clés numériques sont renumérotées depuis 0 ; quand les deux tableaux ont la même clé de type chaîne, la valeur du dernier tableau l'emporte. Passez autant de tableaux que vous voulez.

array_merge() ne modifie pas ses arguments. Elle renvoie le tableau combiné, donc affectez le résultat : $all = array_merge($all, $more);.

Les clés numériques sont renumérotées

array_merge() traite les clés entières comme des positions, pas comme des noms. Chaque élément à clé entière est ajouté à la suite et reçoit une nouvelle clé depuis 0, même si les tableaux utilisaient les mêmes nombres ou avaient des trous. C'est ce que vous voulez pour des listes, et une surprise quand les nombres sont des identifiants.

Les clés de type chaîne qui ressemblent à des entiers ('101') sont stockées comme des entiers, elles sont donc aussi renumérotées. Des clés comme 'id101' restent telles quelles.

array_merge ou l'opérateur +

L'opérateur + (union de tableaux) combine aussi des tableaux, mais avec la règle inverse : pour toute clé qui existe déjà dans le tableau de gauche, la valeur de gauche l'emporte et celle de droite est abandonnée. Il ne renumérote jamais. Cela fait de + la façon naturelle de compléter avec des valeurs par défaut, et d'array_merge() la façon naturelle de les écraser.

array_merge($a, $b)$a + $b
Même clé de type chaînevaleur de $bvaleur de $a
Clés entièresrenumérotées, toutes les valeurs gardéesgardées, $b perd les conflits
Usage typiqueassembler des listes, écraser des réglagescompléter avec des valeurs par défaut, garder des identifiants

Le dernier exemple du bloc est le piège classique de + : ['a', 'b'] + ['x', 'y', 'z'] donne a, b, z, car les clés 0 et 1 existent déjà à gauche.

Syntaxe de décomposition : [...a,...a, ...b]

L'opérateur de décomposition déballe des tableaux dans un littéral de tableau. Il se comporte comme array_merge() : les clés entières sont renumérotées et, depuis PHP 8.1, les clés de type chaîne sont permises et la dernière l'emporte. Il se lit bien quand vous mélangez des tableaux et des valeurs isolées.

Pour ajouter un tableau à un tableau existant sur place, voir array_push() avec l'opérateur de décomposition.

Fusionner un tableau de tableaux

Quand les tableaux à combiner sont eux-mêmes dans une liste, décomposez cette liste dans array_merge(). C'est aussi la façon rapide de fusionner dans une boucle : rassemblez les morceaux, puis fusionnez une fois.

Écrire $all = array_merge($all, $batch); dans la boucle fonctionne, mais copie tout le tableau grandissant à chaque passage, ce qui devient lent avec des milliers d'éléments.

array_merge_recursive et array_replace

array_merge_recursive() fusionne aussi les tableaux imbriqués, mais pour une clé de type chaîne en double contenant des valeurs simples, elle n'écrase pas : elle rassemble les deux valeurs dans un nouveau tableau. C'est rarement ce qu'on veut pour une configuration. array_replace_recursive() est généralement le bon outil dans ce cas : elle écrase les valeurs à chaque niveau et garde les clés.

Lisez les trois lignes JSON de haut en bas : array_merge() a remplacé tout le tableau db et perdu host, array_merge_recursive() a transformé port et debug en listes de deux éléments, et array_replace_recursive() a produit la configuration voulue.

Erreur fréquente : fusionner ne supprime rien

array_merge() garde les valeurs en double rangées sous des clés différentes. Fusionner deux listes de tags vous donne deux fois chaque tag commun. Passez le résultat dans array_unique() puis array_values() pour le renuméroter.

La page array_unique explique comment supprimer les doublons dans des lignes et des tableaux imbriqués.

Questions fréquentes

Quelle est la différence entre array_merge et + en PHP ?

Pour des clés de type chaîne en double, array_merge($a, $b) garde la valeur de $b, alors que $a + $b garde celle de $a. Pour les clés numériques, array_merge() ajoute et renumérote tout, alors que + garde les clés numériques et abandonne tout élément de $b dont la clé existe déjà dans $a.

Comment fusionner des tableaux en gardant les clés numériques ?

Utilisez $a + $b si le tableau de gauche doit l'emporter, ou array_replace($a, $b) si c'est celui de droite. array_merge() renumérote toujours les clés numériques depuis 0.

Comment fusionner un tableau de tableaux en PHP ?

Décomposez le tableau extérieur dans array_merge() : $all = array_merge(...$lists);. Elle renvoie [] pour une liste vide. Rassemblez d'abord les tableaux dans une boucle et fusionnez une seule fois à la fin ; appeler array_merge() dans la boucle copie le résultat grandissant à chaque fois.

Peut-on utiliser l'opérateur de décomposition avec des clés de type chaîne en PHP ?

Oui, depuis PHP 8.1. [...$a, ...$b] se comporte alors comme array_merge($a, $b) : les clés numériques sont renumérotées et une clé de type chaîne ultérieure écrase la précédente.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER