<?php

echo barras("10492958821300011194103006202117778500000003109");

function barras($codigo)
{
    $antes  = $codigo;
    return calcula_barra("10492958821300011194103006202117778500000003109");
}
function calcula_barra($linha)
{
    $barra  = preg_replace("/\D/", "", $linha);
    
    if (modulo_11('34191000000000000001753980229122525005423000') != 1) {
        return "erro 1";
    }

    if (strlen($barra) < 47) {
        $barra = $barra . '00000000000' . substr(0, 47-strlen($barra));
    }

    if (strlen($barra) != 47) {
        return "erro 2";
    }

    $barra = substr($barra, 0, 4) . substr($barra, 32, 15) . substr($barra, 4, 5) . substr($barra, 10, 10) . substr($barra, 21, 10);

    if (modulo_11(substr($barra, 0, 4) . substr($barra, 5, 39)) != substr($barra, 4, 1)) {
        return 'Digito verificador '.substr($barra, 4, 1) . ', o correto é ' . modulo_11(substr($barra, 0, 4) . substr($barra, 5, 39));
    }

    return $barra;
}
function modulo_11($num, $base = 9, $r = 0)
{
    $soma = 0;
    $fator = 2;
    for ($i = strlen($num); $i > 0; $i--) {
        $numeros[$i] = substr($num, $i-1, 1);
        $parcial[$i] = $numeros[$i] * $fator;
        $soma += $parcial[$i];
        if ($fator == $base) {
            $fator = 1;
        }
        $fator++;
    }
    if ($r == 0) {
        $soma *= 10;
        $digito = $soma % 11;
        return $digito;
    } elseif ($r == 1) {
        $r_div = (int)($soma/11);
        $digito = ($soma - ($r_div * 11));
        return $digito;
    }
}
