Les différentes façons de fusionner deux tableaux en PHP

Quelles sont les différences entre array_merge, array_merge_recursive et l'opérateur + ?

11 janvier 2014

Cet article va vous présenter trois façons de fusionner des tableaux avec des fonctions natives de PHP : array_merge, array_merge_recursive et l'opérateur +.

Attention, certains résultats risquent de vous surprendre !

Pour illustrer les exemples, nous allons utiliser une petite partie de la généalogie des elfes du seigneur des anneaux.

Initialisation des tableaux

Pour faire un bon exemple, il nous faut des gens sans rapports entre eux et d'autres avec des ancêtres (une clé de tableau) communs.

Les lignées d'Earendil et de Finwe seront nos tests avec un ancêtre commun. Les lignées de Thranduil et Galadhon seront ceux qui n'ont aucune ascendance commune avec les autres.

Initialisation des tableaux

$elfes1 = array(
    'Earendil' => array('Elros' => array('Aragorn' => array())),

    'Finwe' => array('Finarfin' => array('Galadriel' => array())),

    'Thranduil' => array('Legolas' => array()),
);

$elfes2 = array(
    'Earendil' => array('Elrond' => array('Arwen' => array())),

    'Finwe' => array('Fingolfin' => array('Fingon' => array())),

    'Galadhon' => array('Celeborn' => array()),
);	
	

La fonction array_merge

array_merge de deux tableaux

var_dump(array_merge($elfes1, $elfes2));


/* Affichage :
array(4) {
	["Earendil"] => array(1) {
		["Elrond"] => array(1) {
			["Arwen"] => array(0) {
			}
		}
	}
	["Finwe"] => array(1) {
		["Fingolfin"] => array(1) {
			["Fingon"] => array(0) {
			}
		}
	}
	["Thranduil"] => array(1) {
		["Legolas"] => array(0) {
		}
	}
	["Galadhon"] => array(1) {
		["Celeborn"] => array(0) {
		}
	}
}
*/



var_dump(array_merge($elfes2, $elfes1));


/* Affichage :
array(4) {
	["Earendil"] => array(1) {
		["Elros"] => array(1) {
			["Aragorn"] => array(0) {
			}
		}
	}
	["Finwe"] => array(1) {
		["Finarfin"] => array(1) {
			["Galadriel"] => array(0) {
			}
		}
	}
	["Galadhon"] => array(1) {
		["Celeborn"] => array(0) {
		}
	}
	["Thranduil"] => array(1) {
		["Legolas"] => array(0) {
		}
	}
}

*/
	

Les clés sans conflits : les éléments se trouvent dans le tableau résultat quel que soit l'ordre d'appel de la fonction. Les éléments du premier tableau sont toujours insérés en premier.

Les clés avec conflits : la fonction array_merge garde la valeur du second tableau, la valeur du premier tableau est supprimée.

L'opérateur +

Addition de deux tableaux

var_dump($elfes1 + $elfes2);


/* Affichage :
array(4) {
	["Earendil"] => array(1) {
		["Elros"] => array(1) {
			["Aragorn"] => array(0) {
			}
		}
	}
	["Finwe"] => array(1) {
		["Finarfin"] => array(1) {
			["Galadriel"] => array(0) {
			}
		}
	}
	["Thranduil"] => array(1) {
		["Legolas"] => array(0) {
		}
	}
	["Galadhon"] => array(1) {
		["Celeborn"] => array(0) {
		}
	}
}
*/



var_dump($elfes2 + $elfes1);


/* Affichage :
array(4) {
	["Earendil"] => array(1) {
		["Elrond"] => array(1) {
			["Arwen"] => array(0) {
			}
		}
	}
	["Finwe"] => array(1) {
		["Fingolfin"] => array(1) {
			["Fingon"] => array(0) {
			}
		}
	}
	["Galadhon"] => array(1) {
		["Celeborn"] => array(0) {
		}
	}
	["Thranduil"] => array(1) {
		["Legolas"] => array(0) {
		}
	}
}

*/
	

Les clés sans conflits : les éléments se trouvent dans le tableau résultat quel que soit l'ordre d'appel de la fonction. Les éléments du premier tableau sont toujours insérés en premier.

Les clés avec conflits : l'opérateur + garde la valeur du premier tableau, la valeur du second tableau est supprimée. Ainsi tableau1 + tableau2 = array_merge(tableau2, tableau1).

La fonction array_merge_recursive

array_merge_recursive de deux tableaux

var_dump(array_merge_recursive($elfes1, $elfes2));


/*
array(4) {
	["Earendil"] => array(2) {
		["Elros"] => array(1) {
			["Aragorn"] => array(0) {
			}
		}
		["Elrond"] => array(1) {
			["Arwen"] => array(0) {
			}
		}
	}
	["Finwe"] => array(2) {
		["Finarfin"] => array(1) {
			["Galadriel"] => array(0) {
			}
		}
		["Fingolfin"] => array(1) {
			["Fingon"] => array(0) {
			}
		}
	}
	["Thranduil"] => array(1) {
		["Legolas"] => array(0) {
		}
	}
	["Galadhon"] => array(1) {
		["Celeborn"] => array(0) {
		}
	}
}
*/



var_dump(array_merge_recursive($elfes2, $elfes1));


/*
array(4) {
	["Earendil"] => array(2) {
		["Elrond"] => array(1) {
			["Arwen"] => array(0) {
			}
		}
		["Elros"] => array(1) {
			["Aragorn"] => array(0) {
			}
		}
	}
	["Finwe"] => array(2) {
		["Fingolfin"] => array(1) {
			["Fingon"] => array(0) {
			}
		}
		["Finarfin"] => array(1) {
			["Galadriel"] => array(0) {
			}
		}
	}
	["Galadhon"] => array(1) {
		["Celeborn"] => array(0) {
		}
	}
	["Thranduil"] => array(1) {
		["Legolas"] => array(0) {
		}
	}
}
*/
	

Les clés sans conflits : les éléments se trouvent dans le tableau résultat quel que soit l'ordre d'appel de la fonction. Les éléments du premier tableau sont toujours insérés en premier.

Les clés avec conflits : la fonction array_merge_recursive combine les deux valeurs dans un tableau jusqu'à ce qu'il n'y ait plus de conflit. Les éléments du premier tableau sont récursivement insérés en premier.



La logique relative aux différentes fonctions est valable pour n tableaux.

A bientôt !

Par
Créateur et administrateur.

Dans la même catégorie

Regexp en PHP, le mémo indispensable
La fonction isset et la valeur null
Le lazy load en PHP
La priorité des opérateurs en PHP

Commentaire(s)