2009-08-06 6 views
3

Wenn mein Code wie folgt aussieht:Verhindern von "One Hours" "One Minutes" "One Days"

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"; 

Wie würde ich es loszuwerden Sachen sagen wie:

1 Tag vor. vor 1 Jahren. vor 1 Minuten. vor 1 Stunde.

Danke :)

+0

Ist Ihre Anwendung lokalisierbar? –

+0

können Sie jemals eine "generische" Plural verwenden: Tag (e), Stunde (n), Minute (n), und so – NeDark

Antwort

-1

Machen Sie die Mathematik.

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

usw.

2
$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; 

Dies teilt durch alle möglichen Zeittypen und gibt ein, dass es nicht zu einem Bruchteil dreht. Indem wir den Zahlenwert vom Typ trennen, können wir dann testen, ob die Zahl == 1 ist, und das Wort korrigieren.

+0

+1 Dachte nicht in diesem Ansatz, sehr clever! – Rodrigo

+0

solange du nicht international bist, ja. funktioniert nicht in allen Sprachen ;-) –

+0

Habe es gerade mal mit etwas anderem aktualisiert. Nahm aber eine Weile. –

7

Kann ganz knapp mit einem ternären Operator erfolgen:

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"; 
     } 
    } 
} 
+0

$ interval = "$ minutes". (($ Minuten> 1)? "Minuten": "Minute"). "vor"; ein bisschen weniger Wiederholung :-) –

+0

@Philippe Gerber - Guter Anruf, weitermachen und bearbeiten. – karim79

+0

nicht genug Karma ... :-) –

3

Noch eine andere Lösung.

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"; 
+0

+1 - Ich liebe es! – karim79

7

Wenn Ihre App international ist und mit Hilfe der gettext-Erweiterung, können Sie etwas tun:

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

Sie können eine Wrapper-Funktion, um es erstellen:

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

Dies ist der beste Weg imo.

1
if ($interval < 60) { 
    $unit = 'Second'; 
} else if ($interval < 1440) { 
    $unit = 'Minute'; $interval /= 60; 
} else if ($interval < 86400) { 
    $unit = 'Hour'; $interval /= 1440; 
} else { 
    $unit = 'Day'; $interval /= 86400; 
} 
$interval = intval($interval); 
$interval = "$interval $unit" . ($interval == 1 ? '' : 's') . " ago"; 
0

Hier ist ein generischer PHP-Snip für Strings wie "1 Monat, 2 Wochen und 30 Sekunden".

 
$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"; 
} 

+2

beim Geben -1 bitte beschreiben warum –