Ahmed Nagi
Ahmed Nagi

Reputation: 97

Get week and day from days

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

Answers (2)

Cid
Cid

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

Donkarnash
Donkarnash

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

Related Questions