/**
 * Soma um vetor de horas
 * @param array[string] $tempos Vetor de horas no formato [+-]H:M:S
 * @return Total de horas no formato H:M:S
 */
function somar_horas(array $tempos) {
    $total_segundos = 0;
    foreach ($tempos as $tempo) {
        if (preg_match('/([+-]?)(\d{2}):(\d{2}):(\d{2})/', $tempo, $matches)) {
            $multiplicador = $matches[1] == '-' ? -1 : 1;
            $total_segundos += $multiplicador *
                               ((int)$matches[2] * 3600 + (int)$matches[3] * 60 + (int)$matches[4]);
        } else {
            throw new InvalidArgumentException('Tempo no formato errado: '.$tempo, 1);
        }
    }
    $sinal          = $total_segundos > 0 ? '' : '-';
    $horas          = floor($total_segundos / 3600);
    $total_segundos = $total_segundos % 3600;
    $minutos        = floor($total_segundos / 60);
    $segundos       = $total_segundos % 60;
    return sprintf('%s%02d:%02d:%02d', $sinal, $horas, $minutos, $segundos);
}

// Exemplo
$vetor = array('23:45:09', '13:56:59', '-00:02:01');
echo somar_horas($vetor);