通过动态设置星期几(例如-thursday)来对函数进行php挑战,并让函数遍历每一天(星期五,星期六..星期二),直到满足条件i> 0。 我已经进行了彻底搜索,但找不到匹配的解决方案。
请查看以下细分:
我的表单: showing user input that's counted
我的代码:
//get duraiton in days
function durationInDays($data) {
$startDate = date_create($data['startdate']);
$endDate = date_create($data['enddate']);
$dateDiff = date_diff($startDate,$endDate);
$durationInDays = $dateDiff -> format("%a");
return $durationInDays;
}
//pass duration in days to function to break into weeks and days
function numberOfWeeksAndDays($durationInDays) {
$days = $numdays%7;
$weeks = floor($numdays/7);
return [$weeks, $days];
}
//parse in number of days into function to loop starting from
//day of week of start date say --thursday for example with a
//condition to stop loop once numberOfDays is zero.
function extraMassCount($dayOfWeek, $numberOfDays, $countMass) {
$daysOfTheWeek = [
'monday','tuesday','wednesday','thursday','friday','saturday','sunday',
'monday','tuesday','wednesday','thursday','friday','saturday','sunday'
];
$massCountForExtraDays = 0;
for ($i = $numberOfDays; $i > 0; $i--) {
if($daysOfTheWeek[$i]=='monday')
$massCountForExtraDays += $countMass[0];
if($daysOfTheWeek[$i]=='tuesday')
$massCountForExtraDays += $countMass[1];
if($daysOfTheWeek[$i]=='wednesday')
$massCountForExtraDays += $countMass[2];
if($daysOfTheWeek[$i]=='thursday')
$massCountForExtraDays += $countMass[3];
if($daysOfTheWeek[$i]=='friday')
$massCountForExtraDays += $countMass[4];
if($daysOfTheWeek[$i]=='saturday')
$massCountForExtraDays += $countMass[5];
if($daysOfTheWeek[$i]=='sunday')
$massCountForExtraDays += $countMass[6];
}
return $massCountForExtraDays;
}
问题:如果$ numberOfDays = 6,则i = 6,该函数以星期五(不是开始日期)开始。
我的问题:我如何实现dayOfWeek参数,以便功能extraMassCount将动态开始计数,例如,如果startdate是星期四,则是星期四,而不是硬编码开始的方式?我希望我的问题很清楚。
即,如表格所示,该功能应该计算每天检查的质量数并将它们相加。从开始日期到结束日期。将durationInDays分解为几周和几天后,我需要在开始日期说--wednesday的函数开始,并在以后的每一天添加countMass(这是数据类型为int的用户检查的质量计数)。星期五等–感谢您的帮助!
答案 0 :(得分:1)
像这样,具有相对的日期格式和DateTime类
$Date = new DateTime;
//go to monday
$Date->modify('monday this week');
for($i=0;$i<10;++$i){
echo $Date->format('l')."\n";
$Date->modify('+1 days'); //go to next day
}
输出
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
我认为您可以解决其他问题,因为我不确定该怎么做。
如果您想要当天的数字,则像$countMass[0];
这样的部分,可以使用w
格式。但是0
是星期天,如果我没记错的话。
for($i=0;$i<10;++$i){
$Date->modify('+1 days');
//dont assume your inputs will be correct
if(isset($countMass[$Date->format('w')])){
$massCountForExtraDays += $countMass[$Date->format('w')];
}
}
PS。而不是所有这些单独的if语句,这是性能不佳的选择。我只使用switch语句,但至少要将它们与else
连接起来,这样它们就不必每次都不必要地求值了。 $daysOfTheWeek[$i]
只能等于其中之一。如果您在上面注意到,我只是对其进行了优化。