次のような文字列 $s と配列 $a があります。

$s = 'xx<0>x<3><2>x';
$a = array('A', 'B', 'C', 'D');

これを、<0> を $a[0] で置き換える、<1> を $a[1] で置き換える、.... ということをしたいです。
今はこうしています。

for ($i = 0; $i < count($a); $i++) {
 $pat = '/<' . $i . '>/';
 $s = preg_replace($pat, $m[i], $s);
}

しかし、これだと配列の長さが長くなるほどループの回数が増えます。
できれば、preg_replace()を1回だけ呼び出すだけにしたいのですが、できますでしょうか。
preg_replace_callback() を使えばできるのかと思いましたが、コールバック関数に $a を渡すことができないため、できなさそうです。

どなたか教えてください。