Как мне пропустить день массива? - PullRequest
1 голос
/ 27 октября 2019

У меня есть массив с датами с сегодняшнего дня -> сегодня + 14 дней. Структура выглядит так:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [datum] => DateTimeImmutable Object
                        (
                            [date] => 2019-11-04 16:30:00.000000
                            [timezone_type] => 1
                            [timezone] => +01:00
                        )
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [datum] => DateTimeImmutable Object
                        (
                            [date] => 2019-11-05 17:00:00.000000
                            [timezone_type] => 1
                            [timezone] => +01:00
                        )
                )

        )
)

Теперь я хотел бы знать, какие даты отсутствуют.

Я пытаюсь что-то вроде этого:

for ($i = 0; $i < 14; $i++) {
    $checkDate = DateTime::createFromFormat('Y-m-d H:i', date('Y-m-d H:i'))->add(new DateInterval("P".$i."D"));

    if(array_search($checkDate, array_column($freeTime, 'datum')) !== false) {
        echo "FOUND<br />";
    } else {
        echo "Not Found<br />";
    }
}

Но это только повторение"не найден".

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Я видел, что вам пока не удалось найти удовлетворительный ответ, возможно, это поможет вам на вашем пути.

<code>/* 
 * step 1: create benchmark array ($benchmarkDates)
 * containing all consecutive dates from $start
 */
$start = '2019-10-27 16:30:00';
$days = 14; // total number of days (including $start)
$dateObj = new DateTimeImmutable($start);
$benchmarkDates[] = $dateObj->format('Y-m-d H:i:s'); // store the first bench date
for ($i = 1; $i < $days; $i++) {
    $period = 'P' . $i . 'D';
    $interval = new DateInterval($period);
    $dateObj0 = $dateObj->add($interval);
    $benchmarkDates[] = $dateObj0->format('Y-m-d H:i:s'); // store the next bench date
}

/* 
 * step 2: retrieve dates from DateTimeImmutable objects
 * in the array you want to check for date-gaps ($subject).
 */
foreach ($subject as $key => $value) {
    foreach ($value as $key => $value) {
        $subjectDates[] =  $value['datum']->format('Y-m-d H:i:s'); // store dates
    }
}

/*
 * step 3: store missing dates
 * check subject against benchmark
 */
foreach($benchmarkDates as $key => $value) {
    if(!in_array($value, $subjectDates)) {
        $missingDates[] = $value;
    }
}

echo '<pre>';
print_r($missingDates);
echo '
';

Рабочая демо

0 голосов
/ 27 октября 2019

$freetime - это массив, содержащий ваши даты, $start - начальная дата, а $end - окончание. Затем он вернет отсутствующие даты в другом массиве $missingDates.
РЕДАКТИРОВАТЬ 2:
Я просто разделил ваш многомерный массив и сохранил объект даты и времени в другом массиве, а затем сравнил его. Извините, что потребовалосьТак много времени. РЕДАКТИРОВАТЬ 3:
$start и $end переменные предназначены для проверки дат.

 <?php
    error_reporting(1);
    $freetime     = array();
    $onlydates    = array();
    $missingDates = array();
    for ($i = 0; $i < 14; $i++ ) {
    $freetime[$i][0]['datum'] = DateTime::createFromFormat('Y-m-d H:i', 
    date('Y-m-d H:i'))->add(new DateInterval("P".$i."D"));
    }   
    foreach($freetime as $free){
        foreach($free as $fr){
            foreach($fr as $f){     
              $date = date_format($f,"Y-m-d");
              array_push($onlydates,$date);
            }
        }
   }
   $interval  = new DateInterval('P1D');     
   $Start = date_create("2019-10-27");
   $End   = date_create("2019-11-10");

   $period    = new DatePeriod($Start, $interval, $End);
   foreach($period as $day) {
     $formattedDay = $day->format("Y-m-d");
     if(!in_array($formattedDay, $onlydates)){
        $missingDates[] = $formattedDay;
     }
   }

   foreach($missingDates as $missdates){
      echo " / ".$missdates;
   }


    ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...