Рассчитать промежуточные дни недели между двумя днями недели в PHP - PullRequest
0 голосов
/ 30 ноября 2018

Учитывая два рабочих дня: понедельник, среда.

Как вы можете получить промежуточные дни в этом массиве?Ответ: понедельник, вторник, среда.

Случай 2: с понедельника по понедельник Ответ: понедельник, вторник, среда, четверг, пятница, суббота, воскресенье, понедельник

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Мое решение - больше перемещать внутренний указатель массива до тех пор, пока поля не будут найдены, и поместить элементы между полями в другой массив результатов.Может использоваться независимо от того, какие данные находятся в исходном массиве.

function getDaysInBetween($start, $end)
    {
        $weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

        $start_found = false;

        $days = [];

        while(true) {
            $next = next($weekdays);
            $day = (empty($day) || !$next)?reset($weekdays):$next;

            if($day === $start) $start_found = true;

            if($start_found) {
                $days[] = $day;
                if($day===$end && count($days)>1) return implode(", ",$days);
            }

        }

    }

Демонстрационная версия здесь: https://3v4l.org/D5063

0 голосов
/ 01 декабря 2018

Я создал эту функцию, которая делает это, и комментарии покажут вам, как это было сделано.

function list_days($start, $end) {

    //convert day "word" to it's given number
    //Monday = 1, Tuesday = 2 ... Sunday = 7
    $start_n = date('N', strtotime($start));
    $end_n = $end_range = date('N', strtotime($end));

    //we also set $end_range above, by default it's set to the $end day number, 
    //but if $start and $end are the same it will be changed later.

    //create an empty output array
    $output = [];

    //determine end_range for the for loop
    //if $start and $end are not the same, the $end_range is simply the number of $end (set earlier)
    if($start_n == $end_n) {

        //if $start and $end ARE the same, we know there is always 7 days between the days
        //So we just add 7 to the start day number.
        $end_range = $start_n + 7;
    }

    //loop through, generate a list of days
    for ($x = $start_n; $x <= $end_range; $x++) {

        //convert day number back to the readable text, and put it in the output array
        $output[] = date('l', strtotime("Sunday +{$x} days"));
    }

    //return a string with commas separating the words.
    return implode(', ', $output);
}

Использование:

Пример 1:

echo list_days('Monday', 'Wednesday');
//output: Monday, Tuesday, Wednesday

Пример 2:

echo list_days('Monday', 'Monday');
//output: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, Monday
...