我需要檢查開始/結束日期是否在一個日期范圍內,并且它們之間沒有丟失日期/中斷/漏洞。
$dates_list 可能很大(包含多年的天數),因此性能很重要。如果需要,可以使用最新的 PHP 8.1。
我的 $dates_list 已經在陣列中按時間順序排列。
<?php
function dates_in_consecutive_range(string $start_date, string $end_date, array $dates_list): bool {
// If in consecutive range without missing days (holes), return true, else return false
// If either $start_date or $end_date or both is not in $dates_list, return false
return false;
}
$dates_list = [
'2022-03-11',
'2022-03-12',
'2022-03-13',
'2022-03-14',
'2022-03-18',
'2022-03-19',
];
$start_date = '2022-03-11';
$end_date = '2022-03-14';
var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // true
$start_date = '2022-03-11';
$end_date = '2022-03-18';
var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // false
$start_date = '2022-03-18';
$end_date = '2022-03-19';
var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // true
$start_date = '2022-03-19';
$end_date = '2022-03-20';
var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // false ($end_date not in $dates_list)
示例:https ://3v4l.org/hfk5D#v8.1.3
uj5u.com熱心網友回復:
你在這方面有什么問題?你的評論有邏輯,所以它是實作它們的問題:
// If either $start_date or $end_date or both is not in $dates_list, return false
if (!in_array($start_date, $dates_list) || !in_array($end_date, $dates_list)) {
return false;
}
為了迭代 ,$dates_list我們可以使用DateTime該類來創建$start_date和之間的日期范圍$end_date:
// If in consecutive range without missing days (holes), return true, else return false
$start_dt = new DateTime($start_date);
$end_dt = new DateTime($end_date);
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($start_dt, $interval, $end_dt);
foreach ($period as $dt) {
$curr_date = $dt->format("Y-m-d");
if (!in_array($curr_date, $dates_list)) {
return false;
}
}
把它們放在一起,你會得到以下結果:https ://3v4l.org/6FcL2#v8.1.3
uj5u.com熱心網友回復:
我認為這應該有效,如果無效,請告訴我。它回傳真、真、真、假,盡管代碼狀態注釋中的第二個應該回傳假,但兩個值都在陣列內
<?php
function dates_in_consecutive_range(string $start_date, string $end_date, array $dates_list): bool {
// If in consecutive range without missing days (holes), return true, else return false
// If either $start_date or $end_date or both is not in $dates_list, return false
if(in_array($start_date, $dates_list) <= in_array($end_date, $dates_list)){
return true;
}
else {
return false;
}
}
$dates_list = [
'2022-03-11',
'2022-03-12',
'2022-03-13',
'2022-03-14',
'2022-03-18',
'2022-03-19',
];
$start_date = '2022-03-11';
$end_date = '2022-03-14';
var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // true
$start_date = '2022-03-11';
$end_date = '2022-03-18';
var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // false
$start_date = '2022-03-18';
$end_date = '2022-03-19';
var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // true
$start_date = '2022-03-19';
$end_date = '2022-03-20';
var_dump(dates_in_consecutive_range($start_date, $end_date, $dates_list)); // false ($end_date not in $dates_list)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/429347.html
