2017-10-06 3 views
2

Nach einer sehr langen Zeit der nicht Codierung und immer noch relativ neu zu PHP erstellt ich den folgenden Code-Block, um das Alter von Hunden und Welpen zu berechnen. In verschiedenen Lebensphasen wird das Alter anders gemessen, nur Tage, Wochen und Tage, Monate und Wochen und schließlich in Jahren und Monaten.Wie Tag, Woche und Monat Wörter auf der Grundlage von Menge in PHP plural

Ich habe derzeit zwei Probleme, die im folgenden Code behandelt werden müssen.

  1. abhängig von der Leistung des Alters kann das Ergebnis „2 Jahre 1 Monat“ seinen Ich brauche den Code intelligent genug zu sein, um die Ausgabe zu ändern, in diesem Fall Monat auf „2 Jahre 1 Monat“ singulär ist keine 's'. Ich muss das Gleiche für Jahre, Monate, Wochen und Tage tun. Ich weiß, dass dies mit einer beträchtlichen Menge an Code-Bloat gemacht werden könnte, aber ich bin mir sicher, dass es einen sauberen Weg dafür gibt.

  2. kann immer noch nicht herausfinden, wie wenn das Datum in die Funktion übergeben zu überprüfen, in der Vergangenheit oder Zukunft (wie ein Wurf Welpen in 2 Wochen zu tun), so dass der Code universell sein kann

Ich bin nur ein alter Hund, der seit den Tagen codiert hat, als der Computerspeicher in KB gemessen wurde und Sie ein "Senior Programmer" waren, wenn Sie für ISAM-Datensätze navigieren und programmieren konnten.

function CalcAgeDOB($DOBdate) 
{ 
    date_default_timezone_set("America/Chicago"); 
    $datetime1 = date_create($DOBdate); 
    $datetime2 = date_create(); 
    $DifferenceFormatDays = "%a"; 

    $interval = date_diff($datetime1, $datetime2); 

    $TotalDays = (($interval->format($DifferenceFormatDays))); 

    Switch ($TotalDays) { 
     case ($TotalDays < 0): 
      $ReturnText = "We are still waiting on arrival"; 
      break; 
     case ($TotalDays == 0): 
      $ReturnText = "We were born today"; 
      break; 
     case (($TotalDays >= 1) and ($TotalDays < 31)): 
      $ReturnText = $interval->format("%a Days"); 
      break; 
     case (($TotalDays > 30) and ($TotalDays < 91)): 
      $WholeWeeks = (int)(($TotalDays)/7); 
      $RemainDays = $TotalDays % 7; 
      $ReturnText = "$WholeWeeks Weeks $RemainDays Days"; 
      break; 
     case (($TotalDays > 90) and ($TotalDays < 366)): 
      $MonthDays = $interval->format('%m,%d'); 
      $MonthDaysArray = explode(",", $MonthDays); 
      $WholeMonths = $MonthDaysArray[0]; 
      $WholeWeeks = (int)($MonthDaysArray[1]/7); 
      $ReturnText = "$WholeMonths Months $WholeWeeks Weeks"; 
      break; 
     case ($TotalDays > 365): 
      $ReturnText = $interval->format('%y Years %m Months'); 
      break; 
     default: 
      $ReturnText = "Error"; 
      break; 
    } 

    return $ReturnText;  
} 

echo CalcAgeDOB("02/08/2017"); 

---------------- Bearbeiten 10/06/2017 --------------------- ----

Aktualisierte Codeblock nach der Implementierung von Änderungen von @ Cy-Rossignol dies kümmerte sich um die Frage 1. Ich muss noch aussortieren, ob das Datum in die Funktion in der Vergangenheit oder Zukunft ging. Plural Funktion wurde auch vom Vorschlag aktualisiert, um leere Zeichenfolge zurückzugeben, wenn eine $ Menge von Null übergeben wird. Konvertierte Kontrollstruktur von switch nach if/elseif nach Empfehlungen.

<?php 

function pluralize($quantity, $singular, $plural, $format = '%d %s') 
{ 
    if (empty($quantity)) { 
     return sprintf(""); 
    } 

    if ($quantity === 1) { 
     return sprintf($format, $quantity, $singular); 
    } 

    return sprintf($format, $quantity, $plural); 
} 

function CalcAgeDOB($DOBdate) 
{ 
    date_default_timezone_set("America/Chicago"); 
    $datetime1 = date_create($DOBdate); 
    $datetime2 = date_create(); 
    $DifferenceFormatDays = "%a"; 

    $interval = date_diff($datetime1, $datetime2); 

    $TotalDays = ((int)($interval->format($DifferenceFormatDays))); 

    if ($TotalDays < 0) { 
      $ReturnText = "We are still waiting on arrival"; 
    } elseif (empty($TotalDays)) { 
      $ReturnText = "We were born today"; 
    } elseif (($TotalDays >= 1) and ($TotalDays < 31)) { 
      $ReturnText = pluralize(($TotalDays % 7), 'Day', 'Days'); 
    } elseif (($TotalDays > 30) and ($TotalDays < 91)) { 
      $ReturnText = pluralize(((int)($TotalDays/7)), 'Week', 'Weeks') . ' ' . pluralize(($TotalDays % 7), 'Day', 'Days'); 
    } elseif (($TotalDays > 90) and ($TotalDays < 366)) { 
      $MonthDays = $interval->format('%m,%d'); 
      $MonthDaysArray = explode(",", $MonthDays); 
      $WholeMonths =(int)($MonthDaysArray[0]); 
      $WholeWeeks = (int)($MonthDaysArray[1]/7); 
      $ReturnText = pluralize($WholeMonths, 'Month', 'Months') . ' ' . pluralize($WholeWeeks, 'Week', 'Weeks'); 
    } elseif ($TotalDays > 365) { 
      $YearsMonths = $interval->format('%y,%m'); 
      $YearsMonthsArray = explode(",", $YearsMonths); 
      $WholeYears = (int)($YearsMonthsArray[0]); 
      $WholeMonths = (int)($YearsMonthsArray[1]); 
      $ReturnText = pluralize($WholeYears, 'Year', 'Years') . ' ' . pluralize($WholeMonths, 'Month', 'Months'); 
    } else { 
      $ReturnText = "Error";    
    } 

    return $ReturnText; 

} 



echo CalcAgeDOB("7/3/2016") 

?> 
+0

Diese unkonventionelle 'switch'-Struktur wird nicht wie erwartet funktionieren, wenn' $ TotalDays' '0' ist, weil '0' zu' false' auswertet, aber '($ TotalDays == 0)' zu 'true' auswertet. 'switch'-Anweisungen sind zum Steuern des Flusses gedacht, indem sie die möglichen Werte vergleichen, die eine Variable * gleich * sein kann, aber wir vergleichen diesen Wert mit einem sekundären Wert außerhalb der' switch' Logik im Ausdruck für jeden 'case'-Zweig. Es funktioniert größtenteils dank der dynamischen Natur von PHP, aber verbirgt Fehler als Nebeneffekt. Ziehen Sie stattdessen die Verwendung von 'if ... else'-Blöcken in Betracht. –

+0

Siehe [PHP-Dokumentation für 'switch()'] (http://php.net/manual/en/control-structures.switch.php). –

Antwort

0

Für Englisch, können wir eine einfache Funktion schreiben, die die entsprechende Form eines Wortes auf einer vorgesehenen Menge auf Basis wählt:

function pluralize($quantity, $singular, $plural, $format = '%d %s') 
{ 
    if ($quantity === 1) { 
     return sprintf($format, $quantity, $singular); 
    } 

    return sprintf($format, $quantity, $plural); 
} 

Hier einige Beispiel-Anwendung:

pluralize(5, 'child', 'children');    // "5 children" 
pluralize(1, 'foot', 'feet');     // "1 foot" 
pluralize(0, 'day', 'days');     // "0 days" 
pluralize(3, 'person', 'people', '%2$s: %1$d'); // "people: 3" 

Die Letztes Beispiel zeigt ein benutzerdefiniertes Format, wie von sprintf() erlaubt. Hier ist, wie wir die Funktion in dem Beispiel von der Frage verwenden:

function CalcAgeDOB($DOBDate) 
{ 
    ... 
    switch ($TotalDays) { 
     ... 
     case (($TotalDays > 30) and ($TotalDays < 91)): 
      $ReturnText = pluralize((int)($TotalDays/7), 'Week', 'Weeks') 
       . ' ' . pluralize($TotalDays % 7, 'Day', 'Days'); 
      ); 
      break; 
... 

Wenn mit Daten arbeiten, sollen Sie die Carbon-Bibliothek, die PHP Datum und Uhrzeit Funktionalität mit einem großen, ausdruck API wickelt:

$dob = Carbon::parse('2017-10-01 00:00:00'); 

$dob->diffInDays(Carbon::now()); // "5" 
Carbon::now()->diffForHumans($dob); // "5 days ago" 

Wir können diese Bibliothek in Kombination mit unserer pluralize() Funktion oben verwenden.

Verwandte Themen