【问题标题】:How to remove division by zero from this function?如何从此函数中删除除以零?
【发布时间】:2016-01-04 22:55:13
【问题描述】:

我使用这个php函数将数字时间戳转换为“7天前”之类的东西,但是某个时间戳返回division by zero错误,我不知道如何修复该函数。

function timestamp_to_ago($timestamp){
    if(isset($timestamp) and $timestamp !=''){  
        $difference = time() - $timestamp;
        $periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
        $lengths = array("60","60","24","7","4.35","12","10");
        for($j = 0; $difference >= $lengths[$j]; $j++){
            $difference /= $lengths[$j]; // <<< line with problem
        }
        $difference = round($difference);
        if($difference != 1) $periods[$j].= "s";
        $text = "$difference $periods[$j] ago";
        return $text;
    }
}

// returns division by zero error
echo timestamp_to_ago(1135288800);

// doesn't return division by zero
echo timestamp_to_ago(1235288800);

除以零在$difference /= $lengths[$j];这一行触发,但我不知道如何修复该函数以避免此错误。

【问题讨论】:

  • 如果 $lengths[$j]==0 { $lengths[$j]=1}
  • 也许您可以检查$lengths[$j] 值并仅在它具有非零值时执行除法运算?

标签: php function divide-by-zero


【解决方案1】:

如果超过十年会怎样?

    for($j = 0; isset($lengths[$j]) && $difference >= $lengths[$j]; $j++){
        $difference /= $lengths[$j]; // <<< line with problem
    }

【讨论】:

    【解决方案2】:

    问题是你的循环在到达$lengths 的末尾时并没有停止。当$i 达到数组长度时,$lengths[$i] 未定义,除法时转换为0

    您可以使用foreach 代替for

    foreach ($lengths as $j => $length) {
        if ($difference < $length) {
            break;
        }
        $difference /= $length;
    }
    $period = $periods[$j];
    

    【讨论】:

      【解决方案3】:

      这些数组似乎是静态的,并为您的结果建立了基线。如果是这样,您缺少"second" 的值。您要么需要在 lengths 中添加一个值,要么从 periods 中删除 "seconds" 以修复此除以零错误。我相信(在阅读了您的问题之后,您正在努力实现以下目标,因为似乎逻辑有缺陷。

      function timestamp_to_ago($timestamp){
          if(isset($timestamp) and $timestamp !=''){  
              $difference = time() - $timestamp;
              $periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
              $lengths = array("60","60","24","7","4.35","12","10");
              for($j = 1; $difference >= $lengths[$j-1]; $j++){
                  $difference /= $lengths[$j];
              }
              $difference = round($difference);
              if($difference != 1) $periods[$j].= "s";
              $text = "$difference $periods[$j-1] ago";
              return $text;
          }
      }
      

      如果您看的话,我将不理会数组,因此您仍然可以将 seconds 放入您的返回值中,但似乎这应该可以解决逻辑错误。

      【讨论】:

        猜你喜欢
        • 2015-02-22
        • 2019-10-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多