Теперь знаю:
🧜♀️ array_merge: строковые ключи второго массива перезаписывают совпадающие ключи из первого массива, а числовые всегда переиндексируются с нуля, сохраняя элементы обоих массивов;
🐍 array_replace: и строковые, и числовые ключи перезаписываются, индексы сохраняются.
Пример с фокусом на числовые ключи (ибо в них вся разница):
$a = [
0 => 'foo',
5 => 'bar',
];
$b = [
5 => 'baz',
10 => 'qux',
];
array_merge($a, $b);
// [0 => 'foo', 1 => 'bar', 2 => 'baz', 3 => 'qux']
array_replace($a, $b);
// [0 => 'foo', 5 => 'baz', 10 => 'qux']