Удалить выходные из массива следующих 10 дней - PullRequest
0 голосов
/ 21 января 2019

Я создал массив следующих 10 дней с буфером на 2 дня (то есть, если это понедельник, массив начинается в среду).Сейчас я пытаюсь удалить выходные из моего массива, но не знаю, как это сделать.Ниже мой PHP и возвращенный массив:

    $date_buffer = strtotime('+2 days');
    $days = array();

    for ($i = 0; $i < 10; $i++) {
        $days[date($date_buffer)] = date("l, jS M", $date_buffer);
        $date_buffer = strtotime('+2 days', $date_buffer);
    }

    print_r($days);

Это возвращает:

Array ( 
    [1548192409] => Tuesday, 22nd Jan 
    [1548365209] => Thursday, 24th Jan 
    [1548538009] => Saturday, 26th Jan 
    [1548710809] => Monday, 28th Jan 
    [1548883609] => Wednesday, 30th Jan 
    [1549056409] => Friday, 1st Feb 
    [1549229209] => Sunday, 3rd Feb 
    [1549402009] => Tuesday, 5th Feb 
    [1549574809] => Thursday, 7th Feb 
    [1549747609] => Saturday, 9th Feb 
)

Может кто-нибудь помочь мне понять, как я отфильтрую любые субботы или воскресенья из вышеприведенного

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Это хорошая работа для класса DatePeriod. Мы устанавливаем период из 10 повторений по 2 дня от времени начала (через 2 дня), а затем можем перебирать даты, проверяя выходной день (день недели = 0 или 6), чтобы исключить их из вывода:

$start = new DateTime('+2 days');
$period = new DatePeriod($start, new DateInterval('P2D'), 9);
foreach ($period as $date) {
    $dow = (int)$date->format('w');
    if ($dow != 0 && $dow != 6) {
        $days[$date->format('U')] = $date->format('l, jS M');
    }
}
print_r($days);

Выход:

Array (
    [1548194036] => Tuesday, 22nd Jan
    [1548366836] => Thursday, 24th Jan
    [1548712436] => Monday, 28th Jan
    [1548885236] => Wednesday, 30th Jan
    [1549058036] => Friday, 1st Feb
    [1549403636] => Tuesday, 5th Feb
    [1549576436] => Thursday, 7th Feb
)

Если вы хотите 10 последовательных дней (исключая выходные) с 2 дней с сегодняшнего дня, вы просто изменили бы вторую строку кода на:

$period = new DatePeriod($start, new DateInterval('P1D'), 9);

и вывод будет:

Array (
    [1548197829] => Tuesday, 22nd Jan
    [1548284229] => Wednesday, 23rd Jan
    [1548370629] => Thursday, 24th Jan
    [1548457029] => Friday, 25th Jan
    [1548716229] => Monday, 28th Jan
    [1548802629] => Tuesday, 29th Jan
    [1548889029] => Wednesday, 30th Jan
    [1548975429] => Thursday, 31st Jan
)

Демонстрация на 3v4l.org

0 голосов
/ 21 января 2019

Вот простой ответ с использованием цикла while.

https://3v4l.org/0lpGX

<?php

$x = 1; // Start
$y = 10; // Iterations Needed

$days = []; //Empty Array

while($x <= $y) {

    // Set Buffer
    $buffer = 2 + $x;
    // Get Date with Buffer 
    $date = date(strtotime("+$buffer days"));    

    // If the day is a weeday
    if(date('N', $date) < 6){
        // Add to array
        $days[$date] = date("l, jS M", $date);
    // If not, increase max iteration (example: 10 to 11)
    }else{
        $y++;
    }
    // Go to next loop      
    $x++;
}

echo "<pre>";
print_r($days);

?>

Что печатает

Array
(
    [1548283397] => Wednesday, 23rd Jan
    [1548369797] => Thursday, 24th Jan
    [1548456197] => Friday, 25th Jan
    [1548715397] => Monday, 28th Jan
    [1548801797] => Tuesday, 29th Jan
    [1548888197] => Wednesday, 30th Jan
    [1548974597] => Thursday, 31st Jan
    [1549060997] => Friday, 1st Feb
    [1549320197] => Monday, 4th Feb
    [1549406597] => Tuesday, 5th Feb
)
0 голосов
/ 21 января 2019

http://php.net/manual/en/function.date.php

$date_buffer = strtotime('+2 days');
$days = array();

for ($i = 0; $i < 10; $i++) {
    if (!in_array(date('w',$date_buffer), [0,6])) { 
        $days[date($date_buffer)] = date("l, jS M", $date_buffer);
    }
    $date_buffer = strtotime('+2 days', $date_buffer);
}

print_r($days);
...