Sorting an associative array in custom order

This short note shows how you can sort an associative array using another array as order map.

For example, let's take the following problem. There is an array with translations and we need to sort them in the desired order:

$languages = [
	'fr' => 'French',
	'ru' => 'Russian',
	'en' => 'English'
];
$order = [ 'ru', 'en', 'fr', 'es' ]; // desired order

Now, we need to sort $languages array elements by the order in $order array. It can be done by using the array_merge() or array_replace() functions.

$order = array_flip( $order );
$order = array_intersect_key( $order, $languages ); // remove from $order what isn't in $languages

// sort
$languages = array_merge( $order, $languages );
// or
$languages = array_replace( $order, $languages );

Get:

print_r( $languages );
/*
Array
(
	[ru] => Russian
	[en] => English
	[fr] => French
)
*/