"Bir Saat" Önlenmesi

6 Cevap php

: Benim kod gibi görünüyorsa

if($seconds < 60)
  $interval = "$seconds seconds ago";
else
 if($seconds < 3600)
     $interval = floor($seconds / 60) . "minutes ago";
else
    if($seconds < 86400)
         $interval = floor($seconds / 3600) . "hours ago";
    else
         $interval = floor($seconds / 86400) . "days ago";

Onu nasıl şeyler gibi söyleyerek kurtulmak istiyorsunuz:

1 Days ago. 1 Years ago. 1 Minutes ago. 1 Hours ago.

Teşekkürler :)

6 Cevap

App uluslararası ve gettext uzantısını kullanarak ise, böyle bir şey yapabilirsiniz:

sprintf(ngettext('%d minute', '%d minutes', $amount), $amount);

Bunu Sarıcı işlev oluşturabilirsiniz:

function pluralize($singular, $plural, $num) {
  return sprintf(ngettext($singular, $plural, $num), $num);
}

Bu imo en iyi yoldur.

Üçlü bir operatör ile oldukça özlü yapılabilir:

if($seconds < 60) {
    $interval = "$seconds second" . (($seconds != 1) ? "s" : "") . " ago";
} else {
    if($seconds < 3600) {
        $minutes = floor($seconds / 60);
        $interval = "$minutes minute" . (($minutes > 1) ? "s" : "") . " ago";
    } else {
        if($seconds < 86400) {
            $hours =  floor($seconds / 3600);
            $interval = "$hours hour" . (($hours > 1) ? "s" : "") . " ago";
        } else {
            $days = floor($seconds / 86400);
            $interval = "$days day" . (($days > 1) ? "s" : "") . " ago";
        }
    }
}

Yine bir başka çözüm.

if($seconds < 60)
  $interval = "$seconds second";
 else
   if($seconds < 3600)
     $interval = floor($seconds / 60) . " minute";
   else
     if($seconds < 86400)
       $interval = floor($seconds / 3600) . " hour";
     else
       $interval = floor($seconds / 86400) . " day";
$interval .= (reset(explode(" ", $interval)) != 1 ? "s" : "")." ago";
$time = "120";
$array = array("second" => 1,
               "minute" => 60,
			   "hour" => 60,
			   "day" => 24,
			   "year" => 365);
$old_time = 0;
$old_type = false;

// Loop through each type
foreach($array as $type => $seconds)
{
	// Divide
	$time = floor($time/$seconds);
	// If it went into a value lower than 0, stop dividing
	if($time < 1)
	{
		$time = $old_time;
		$type = $old_type;
		break;
	}
	else
	{
		// Continue dividing.
		$old_time = $time;
		$old_type = $type;
	}
}
if($time == 1)
{
	$interval = $time . " ". $type . " ago";
}
else
{
	$interval = $time ." " . $type . "s ago";
}
echo $interval;

Bu, tüm olası saat türleri ile böler ve bir kısmını içine açılmıyor birini verir. Türünden sayı değeri ayırarak, biz o zaman sayı == 1 ise test ve sözcüğü düzeltmek mümkün.

İşte "1 ay, 2 hafta ve 30 saniye" gibi dizeleri almak için bir genel PHP kelepir olduğunu.

$timeUnits = array("month" => 2592000,
                  "week" => 604800,
                  "day" => 86400,
                  "hour" => 3600,
                  "minute" => 60,
                  "second" => 1);

$tmpSeconds = $seconds;

$timeAgoStrings = array();

foreach ($timeUnits as $name => $numOfSeconds) {
   if ($seconds > $numOfSeconds) {
      $val = floor($tmpSeconds / $numOfSeconds);
      $agoStr = ($val > 1) ? $name."s" : $name;
      $timeAgoStrings[] = "$val $agoStr";
      $tmpSeconds = $tmpSeconds - $val; // cut the used time units off our tmpSeconds variable
   }
}
//check if we have more than one string - in case we do then we will pop the last val and add an "and" prefix before the last val instead of a comma
if (count($timeAgoStrings) > 1) {
   $lastString = array_pop($timeAgoStrings);
   $timeAgoStr = implode(", ",$timeAgoStrings)." and $lastString ago";
} else {
   $timeAgoStr = $timeAgoStrings[0]." ago";
}

Matematik yapmak.

else if($seconds < 120)
     $interval = "1 minute ago";
else if($seconds < 172800)
     $interval = "1 day ago"

vb