/**
 * Formata um numero de telefone brasileiro ou retorna false, caso nao consiga
 * @param string $telefone Numero a ser formatado
 * @param string $codigo_padrao Codigo DDD padrao (caso o telefone nao possua)
 * @return string Numero formatado no padrao "+55 (DD) XXXX-XXXX", ou false em caso de falha
 */
function formatar_telefone_br($telefone, $codigo_padrao) {

    // Checar se ja' está no padrao
    if (preg_match('/^\+55 \([\d]{2}\) ([\d]{4})\-([\d]{4})$/i', $telefone)) {
        return $telefone;
    }

    $len = strlen($telefone);

    // Buscar apenas os numeros
    $total_numeros = 0;
    $numeros = '';
    for ($i = 0; $i < $len; $i++) {
        $c = $telefone[$i];
        if (ctype_digit($c)) {
            $numeros .= $c;
            $total_numeros += 1;
        }
    }

    // Analisar de acordo com quantidade de numeros informados
    switch ($total_numeros) {

    // Se informou pais, zero, operadora, DDD e numero
    // 55 0PPDD XXXX XXXX
    case 15:
        if (preg_match('/^(55)0[\d]{2}([\d]{2})([\d]{4})([\d]{4})$/', $numeros, $match)) {
            return sprintf('+%02d (%02d) %04d-%04d', $match[1], $match[2], $match[3], $match[4]);
        }
        return false;

    // Se informou pais, operadora, DDD e numero
    // 55 PPDD XXXX XXXX
    case 14:
        if (preg_match('/^(55)[\d]{2}([\d]{2})([\d]{4})([\d]{4})$/', $numeros, $match)) {
            return sprintf('+%02d (%02d) %04d-%04d', $match[1], $match[2], $match[3], $match[4]);
        }
        return false;

    // Se informou pais, zero, DDD e numero
    // 55 0DD XXXX XXXX
    // Se informou zero, operadora, DDD e numero
    // 0PPDD XXXX XXXX
    case 13:
        if (preg_match('/^(55)0([\d]{2})([\d]{4})([\d]{4})$/', $numeros, $match)) {
            return sprintf('+%02d (%02d) %04d-%04d', $match[1], $match[2], $match[3], $match[4]);
        } elseif (preg_match('/^0[\d]{2}([\d]{2})([\d]{4})([\d]{4})$/', $numeros, $match)) {
            return sprintf('+55 (%02d) %04d-%04d', $match[1], $match[2], $match[3]);
        }
        return false;

    // Se informou pais, DDD e numero
    // 55 DD XXXX XXXX
    case 12:
        if (preg_match('/^(55)([\d]{2})([\d]{4})([\d]{4})$/', $numeros, $match)) {
            return sprintf('+%02d (%02d) %04d-%04d', $match[1], $match[2], $match[3], $match[4]);
        }
        return false;

    // Se informou zero, DDD e numero
    // 0DD XXXX XXXX
    case 11:
        if (preg_match('/^0([\d]{2})([\d]{4})([\d]{4})$/', $numeros, $match)) {
            return sprintf('+%02d (%02d) %04d-%04d', 55, $match[1], $match[2], $match[3]);
        }
        return false;

    // Se informou DDD e numero
    // DD XXXX XXXX
    case 10:
        if (preg_match('/^([\d]{2})([\d]{4})([\d]{4})$/', $numeros, $match)) {
            return sprintf('+%02d (%02d) %04d-%04d', 55, $match[1], $match[2], $match[3]);
        }
        return false;

    // Se informou numero
    // XXXX XXXX
    case 8:
        if (preg_match('/^([\d]{4})([\d]{4})$/', $numeros, $match)) {
            return sprintf('+%02d (%02d) %04d-%04d', 55, $codigo_padrao, $match[1], $match[2]);
        }
        return false;
    }

    return false;
}