选择一周中的某一天并开始向前计数,直到达到php中的设置限制

时间:2019-03-21 13:04:41

标签: php

通过动态设置星期几(例如-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的用户检查的质量计数)。星期五等–感谢您的帮助!

1 个答案:

答案 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

Sandbox

我认为您可以解决其他问题,因为我不确定该怎么做。

如果您想要当天的数字,则像$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]只能等于其中之一。如果您在上面注意到,我只是对其进行了优化。