Reputation: 97
I have a number of days let's say 20 days
I want function to return array of week number and the day of the week.
Current implementation and the problem:
function weekAndDayNumberFromDays($days)
{
$week = (int) floor($days / 7);
$dayRemainder = $days % 7;
return [
'week' => $week,
'day' => $dayRemainder
];
}
Call
foreach (range(1, 20) as $day) {
dump("Day #" . $day, weekAndDayNumberFromDays($day));
}
Output
"Day #1"
array:2 [▼ "week" => 0 "day" => 1 ]
"Day #2"
array:2 [▼ "week" => 0 "day" => 2 ]
"Day #3"
array:2 [▼ "week" => 0 "day" => 3 ]
"Day #4"
array:2 [▼ "week" => 0 "day" => 4 ]
"Day #5"
array:2 [▼ "week" => 0 "day" => 5 ]
"Day #6"
array:2 [▼ "week" => 0 "day" => 6 ]
"Day #7"
array:2 [▼ "week" => 1 "day" => 0 ]
"Day #8"
array:2 [▼ "week" => 1 "day" => 1 ]
"Day #9"
array:2 [▼ "week" => 1 "day" => 2 ]
"Day #10"
array:2 [▼ "week" => 1 "day" => 3 ]
"Day #11"
array:2 [▼ "week" => 1 "day" => 4 ]
"Day #12"
array:2 [▼ "week" => 1 "day" => 5 ]
"Day #13"
array:2 [▼ "week" => 1 "day" => 6 ]
"Day #14"
array:2 [▼ "week" => 2 "day" => 0 ]
"Day #15"
array:2 [▼ "week" => 2 "day" => 1 ]
"Day #16"
array:2 [▼ "week" => 2 "day" => 2 ]
"Day #17"
array:2 [▼ "week" => 2 "day" => 3 ]
"Day #18"
array:2 [▼ "week" => 2 "day" => 4 ]
"Day #19"
array:2 [▼ "week" => 2 "day" => 5 ]
"Day #20"
array:2 [▼ "week" => 2 "day" => 6 ]
I want to print e.g. "Week 1, Day1", "week 3, Day 5" without "Week 0 or Day 0".
Upvotes: 0
Views: 67
Reputation: 15247
There are 7 days in a week. (of course)
You're moving the last day of a week to the next week doing $days % 7
, if day is 7, 7 % 7 == 0
1 % 7 == 1
2 % 7 == 2
...
7 % 7 == 0
So, removing 1 day keeps the last day of the week into the current one :
0 % 7 == 0
1 % 7 == 1
...
6 % 7 == 6
This result can be incremented to have the first day as 1, the second as 2... the 7th as 7
You've been right about adding 1 to the weeks, or simply calling ceil()
, as stated in Donkarnash's answer :
function weekAndDayNumberFromDays($days)
{
$days--;
$week = floor($days / 7) + 1;
$dayRemainder = ($days % 7) + 1;
return [
'week' => $week,
'day' => $dayRemainder
];
}
foreach (range(1, 20) as $day) {
$arr = weekAndDayNumberFromDays($day);
echo "Day #$day : week {$arr['week']}, day {$arr['day']}" . PHP_EOL;
}
Output :
Day #1 : week 1, day 1
Day #2 : week 1, day 2
Day #3 : week 1, day 3
Day #4 : week 1, day 4
Day #5 : week 1, day 5
Day #6 : week 1, day 6
Day #7 : week 1, day 7
Day #8 : week 2, day 1
Day #9 : week 2, day 2
Day #10 : week 2, day 3
Day #11 : week 2, day 4
Day #12 : week 2, day 5
Day #13 : week 2, day 6
Day #14 : week 2, day 7
Day #15 : week 3, day 1
Day #16 : week 3, day 2
Day #17 : week 3, day 3
Day #18 : week 3, day 4
Day #19 : week 3, day 5
Day #20 : week 3, day 6
Upvotes: 1
Reputation: 12835
Try using ceil
instead of floor
function weekAndDayNumberFromDays($days)
{
$week = (int) ceil($days / 7);
$dayRemainder = $days % 7;
return [
'week' => $week,
'day' => $dayRemainder
];
}
Upvotes: 1