egrueda, muy buena solucion.
Solo aclaro que cuando sugeri agregar un cero al inicio de la cadena no fue a cada par, sino al total y no sabia que siempre serian pares.
Por otra parte, en tu ultimo codigo ya no es necesario
$sub = sprintf("%2d", $sub); porque acabas de extraerlo de la cadena y tiene la longitud adecuada, a menos que lo conviertas a numero.