Я думаю, что использование регулярного выражения - лучший способ, может быть, что-то вроде этого:
$text = preg_replace('/([0-9])([0-9]{2})([0-9]{3})([0-9]{4})/', '+27 ($1) $2 $3 $4', $num);
Помните, что $ num должно быть строкой, поскольку ваш номер начинается с 0.
Вы также можете использовать класс символов:
$text = preg_replace('/(\d)(\d{2})(\d{3})(\d{4})/', '+27 ($1) $2 $3 $4', $num);