Как убрать деление на ноль из этой функции?

Я использую эту функцию 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]; но я не знаю, как исправить функцию, чтобы избежать этой ошибки.

0

Решение

Что произойдет, если ему больше десяти лет?

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

Другие решения

Проблема в том, что ваш цикл не останавливается, когда он достигает конца $lengths, когда $i достигает длины массива, $lengths[$i] не определено, и это преобразуется в 0 при делении.

Ты можешь использовать foreach вместо for,

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

Кажется, что эти массивы статичны и устанавливают основу для вашего результата. Если это так, вы пропускаете значение для "second", Вам либо нужно добавить значение в lengths или удалить "seconds" от periods исправить это деление на ноль ошибок. Я верю (после прочтения вашего вопроса, что ниже — это то, чего вы пытаетесь достичь, потому что кажется, что логика ошибочна.

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 положить в возвращаемое значение, но, похоже, это должно исправить ошибку логики.

0
По вопросам рекламы [email protected]