2011-12-28 57 views
0

卡住试图弄清楚这里最好的算法。我有这个简单的功能,其中输入是秒:无效值的处理时间

function strTime($s) { 
    $d = intval($s/86400); 
    $s -= $d*86400; 

    $h = intval($s/3600); 
    $s -= $h*3600; 

    $m = intval($s/60); 
    $s -= $m*60; 

    if ($d) $str = $d . 'day '; 
    if ($h) $str .= $h . 'hr '; 
    if ($m) $str .= $m . 'min '; 
    if ($s) $str .= $s . 'sec'; 

    return $str; 
} 

我喜欢这个,因为它只会显示需要什么。例如,如果秒数在3600,则此功能的输出将为“1小时”。

我的问题是,在某些情况下,秒数将是0(当他们开始使用产品时)。如何在这些情况下显示0秒,但在其他时间,如上面的例子中,我不想让它说“1小时0秒”。我正在努力想办法做到这一点。

+0

让你用的情况下会 1)如果它是唯一的价值,即。 0,然后显示0秒 2.)如果有较大的值,则不显示0秒,即。 1小时,而不是1小时0秒 是吗? – ianace 2011-12-28 03:28:05

+0

在串联使用之前定义'$ str'会更好,如果你没有一天你会发出警告! – 2011-12-28 03:31:59

回答

2

只需检查所有四个if语句运行后字符串是否仍为空。如果$d为0,那么在将数据追加到未初始化的字符串时也会出错;您应该明确初始化$ str,并使所有四个if语句附加。

$str = ""; 

if ($d) $str .= $d . 'day '; 
if ($h) $str .= $h . 'hr '; 
if ($m) $str .= $m . 'min '; 
if ($s) $str .= $s . 'sec'; 

return $str ? $str : "0 sec"; 

也就是说,“如果我们有秒,或字符串仍然是空,显示的秒数。”

应在每个if语句扩展到允许多元化的欢迎,并只可能忽略了,而不是前/后零所有零。

我的意思是,这些例子看起来很怪异:

2天5分钟
5天1秒
1小时5秒

你可能零点为中间单位:

2天0小时5分钟
5每天0.00小时0分1秒
1小时0分5秒

1

我认为这将是对你有好处:

if (empty($str) && $s == 0) 
    $str = '0 secs'; 
else 
    $str .= $s . 'sec';