/** * 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);