Just curious if you had to mod that solution at all. I can't see how it works as desired if the return value of array_splice() isn't being captured. That is also a smaller point as I would expect array_slice() to be used instead, along with proper parameters. Lastly, the 0 for each single-character parts is being appended to the end rather than prepended to the front as your example states.
$mac_addr = '0:C:5:22:32:F4';
$parts = explode( ':', $mac_addr );
$parts = array_slice( $parts, 0, 3 );
foreach ( $parts as & $part )
$part = str_pad( $part, 2, '0', STR_PAD_LEFT );
$mac_addr_sub = implode( '', $parts );
echo $mac_addr_sub; // 000C05