我距离未来的约会还有几天,但想知道具体是多少周和多少天。另外,请注意,如果不到一周,那么它只会返回相同的数字。
这可能吗?
例如
17
天将是2 weeks and 3 days
例如
4
天将是4 days
我会尝试这样的事情:
$days = 17;
$weeks = floor($days / 7);
$dayRemainder = $days % 7;
echo $days.'<br/>'.$weeks.'<br/>'.$dayRemainder;//add whatever logic you need here to get the display the way you want it.
$weeks = intval($days / 7);
$days = $days % 7;
if($weeks)
{
printf("%d weeks", $weeks);
}
if($days)
{
if($weeks)
{
printf(" and ");
}
printf("%d days", $days);
}
类似的东西应该有效
function getnumweeks(d) {
totalDays = d;
numWeeks = floor(d/7);
if numWeeks != 0 {
extraDays = totalDays % 7;
return array(extraDays, numWeeks);
} else {
return array(totalDays, 0)
}
}
然后你可以这样调用和使用它:
ans = getnumweeks(17)
ans[0] <- Contains number of days
ans[1] <- Contains Number of Weeks
正如 Piskvor 提到的,您应该使用模运算符:
$weeks = $days/7;
$daysleft = $days%7;
假设 x 是天数,W 是周数的输出值,D 是剩余天数的输出值。
首先进行整数除法
W = x / 7;
然后取余数: D = x % 7;
$num_days = $databack30[days_to_next_event];
$weeks = floor($num_days/7);
$days = $num_days % 7;
if($weeks>'0'){ $whenitis = ' in '.$weeks.' weeks and '.$days.' days'; }
else { $whenitis = ' in '.$days.' days'; }
对于高级编码人员,您可以通过使用称为 IIFE 的技术来生成两个解包数组(其中一个或两个都可能为空)来避免声明全局范围的变量,以便仅在必要时应用
and
。
将计算出的周和天值传递到各自的匿名函数中,然后有条件地填充不包含元素或包含所需子字符串的元素的返回数组。
当返回的数组被
...
“解包”时,空数组会从父数组中完全省略。这意味着如果一个或两个元素不包含子字符串,则 and
将不会显示。
测试数据:
$tests = [0, 1, 2, 7, 8, 9, 28, 29, 30];
代码:(演示)
echo implode(
' and ',
[
...(fn($w) => $w ? ["$w week" . ($w === 1 ? '' : 's')] : [])(intdiv($days, 7)),
...(fn($d) => $d ? ["$d day" . ($d === 1 ? '' : 's')] : [])($days % 7)
]
) ?: '0 days';
对于寻求更直观编码风格的开发人员,可以声明更多全局变量并有条件地填充数组以进行内爆。 (演示)
$w = intdiv($days, 7);
$d = $days % 7;
if ($w) {
echo "$w week" . ($w === 1 ? '' : 's');
}
echo ($w ? ' and ' : '') . "$d day" . ($d === 1 ? '' : 's');
输出(来自任一脚本):
0: 0 days
1: 1 day
2: 2 days
7: 1 week
8: 1 week and 1 day
9: 1 week and 2 days
28: 4 weeks
29: 4 weeks and 1 day
30: 4 weeks and 2 days