Programming challenge

Nicholas Leippe nick at leippe.com
Fri Sep 28 09:28:07 MDT 2007

```Here it is debugged (still has some corner cases though):
(And thanks Sasha--it's always fun)

<?

echo time2seconds("abc 4:10 4:10:20 4:10:20.30\n");

/*****************************************************************************
*
*  time2seconds()
*
*  Given a string that could contain arithmetic expressions, with the
*  addition that numeric constants could be potentially expressed as
*  times, e.g 1:36 for 96 seconds, or 2:10:08 for 2 hours 10 minutes and
*  8 seconds, also decimal fractions after seconds are allowed, e.g
*  3:45.6 or 3:40:50.67, replace all the time values with their
*  equivalent number of seconds.
*
****************************************************************************/
function time2seconds(\$str) {
\$hr = 0;
\$sec = 0;
\$min = 0;
\$dec = 10;
\$ret = "";
\$in_digit = false;
\$in_time = false;

for (\$i = 0, \$end = strlen(\$str); \$i < \$end; \$i++) {
\$c = \$str[\$i];
if ('0' <= \$c && \$c <= '9') {
\$sec = \$sec * 10 + \$c;
\$in_digit = true;
} else if (\$in_digit && \$c == ':') {
\$hr  = \$min;
\$min = \$sec;
\$sec = 0;
\$in_time = true;
} else if (\$in_time && \$c == '.') {
\$sec += \$c / \$dec;
\$dec *= 10;
} else if (\$in_time) {
\$tmp = \$hr * 3600 + \$min * 60 + \$sec;
\$ret .= "\$tmp\$c";
\$in_digit = false;
\$in_time = false;
\$hr = 0;
\$min = 0;
\$sec = 0;
\$dec = 10;
} else if (\$in_digit) {
\$ret .= "\$sec\$c";
\$in_digit = false;
\$hr = 0;
\$min = 0;
\$sec = 0;
\$dec = 10;
} else {
\$ret .= \$c;
\$hr = 0;
\$min = 0;
\$sec = 0;
\$dec = 10;
}
//echo "time: [\$hr:\$min:\$sec \$dec] ret: [\$ret]\n";
}
return \$ret;
}

```

More information about the PLUG mailing list