2017-10-06 83 views
2

经过很长时间的不编码,并且仍然是相对较新的PHP,我创建了以下代码块来计算狗和小狗的年龄。在不同的生活阶段,年龄的测量方式不同,只有几天,几周和几天,几个月和几周,最后是几年和几个月。如何根据PHP中的数量复制一天,一周和一个月的单词

我目前有两个问题需要在下面的代码中解决。

  1. 依赖于年龄的输出结果可能是“2年5个月,”我需要的代码足够聪明,改变输出为“2年1个月”,在这种情况下,本月是奇异的没有'S'。我需要为年,月,周和日做同样的事情。我知道这可以通过大量的代码膨胀来完成,但我确信有一个干净的方法来做到这一点。

  2. 仍然无法弄清楚如何检查,如果传递给函数的日期是在过去或将来(如小狗的窝在2周内做),这样的代码可以更普遍

我只是一个自从计算机内存以kb为单位进行测量以来就一直在进行编码的老狗,如果您可以导航并为ISAM数据集编程,那么您就是“高级程序员”。

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

----------------编辑10/06/2017 --------------------- ----

在@ Cy-Rossignol实施更改后更新了代码块,这照顾了问题1.我仍然需要理清传入函数的日期是过去还是将来。当传递$数量为零时,多个函数也从建议更新为返回空字符串。根据建议将控制结构从开关转换为if/elseif。

<?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

当'$ TotalDays'为'0'时,由于'0'评估为'false',而'($ TotalDays == 0)'评估为'true',所以这种非常规的'switch'结构将无法按预期工作。 'switch'语句通过比较变量可以*等于*的可能值来控制流,但是我们将该值与每个'case'分支的表达式中'switch'逻辑外部的辅助值进行比较。它的工作原理主要归功于PHP的动态特性,但将错误隐藏起来成为一种副作用。考虑使用“if ... else”块代替。 –

+0

请参阅[PHP文档] switch()'](http://php.net/manual/en/control-structures.switch.php)。 –

回答

0

对于英语,我们可以写一个选择基于所提供的数量单词的适当形式的简单功能:

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

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

下面是一些例子用法:

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" 

的最后一个例子显示sprintf()允许的自定义格式。下面是我们如何可以使用函数的例子,从这个问题:

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

当使用日期,可以考虑使用Carbon库,包装PHP的日期和时间功能与一个伟大的,富有表现力的API:

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

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

我们可以将此库与我们的pluralize()函数结合使用。

相关问题