经过很长时间的不编码,并且仍然是相对较新的PHP,我创建了以下代码块来计算狗和小狗的年龄。在不同的生活阶段,年龄的测量方式不同,只有几天,几周和几天,几个月和几周,最后是几年和几个月。如何根据PHP中的数量复制一天,一周和一个月的单词
我目前有两个问题需要在下面的代码中解决。
依赖于年龄的输出结果可能是“2年5个月,”我需要的代码足够聪明,改变输出为“2年1个月”,在这种情况下,本月是奇异的没有'S'。我需要为年,月,周和日做同样的事情。我知道这可以通过大量的代码膨胀来完成,但我确信有一个干净的方法来做到这一点。
仍然无法弄清楚如何检查,如果传递给函数的日期是在过去或将来(如小狗的窝在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")
?>
当'$ TotalDays'为'0'时,由于'0'评估为'false',而'($ TotalDays == 0)'评估为'true',所以这种非常规的'switch'结构将无法按预期工作。 'switch'语句通过比较变量可以*等于*的可能值来控制流,但是我们将该值与每个'case'分支的表达式中'switch'逻辑外部的辅助值进行比较。它的工作原理主要归功于PHP的动态特性,但将错误隐藏起来成为一种副作用。考虑使用“if ... else”块代替。 –
请参阅[PHP文档] switch()'](http://php.net/manual/en/control-structures.switch.php)。 –