算法帮助-处理学校的功能“;信件日”;.为期6天的重复周


Algorithm help - function to deal with school "letter days". A 6 day repeating week

我在这方面花了太多时间,但无法获得它。我正在寻找一个函数,该函数在给定日期的情况下返回"letter day"。

字母日是一周6天,a至F天不包括周末。如果星期一是A,那么星期五是E,下一个星期一是F,星期二是A。明白了吗?

Week 1: a, b, c, d, e, null, null
Week 2: f, a, b, c, d, null, null
Week 3: e, f, a, b, c, null, null

选择任意日期作为参考。为了这个功能,我们同意4月22日星期一是C日。

谢谢!

这对你有用吗?

<?PHP
$datetime1 = new DateTime('2013-04-22');
$datetime2 = new DateTime('2013-04-30');
$interval = $datetime1->diff($datetime2);
$numDays = $interval->format('%d');
$calibration = 2; //April 22, 2013 is a "C" day.
$numWeekDays = $numDays - 2 * floor($numDays / 7);
$answer = ($numWeekDays + $calibration) % 6 + 1; 
echo chr(64 + $answer);
?>

以下是想法:

for ($i = 0; $i < 100; $i++)
{
    if ($i % 7 == 0)
        echo "<BR>";
    echo GetLetter ($i) . ",";
}
function GetLetter ($numDays)
{
    $letters = Array ("A", "B", "C", "D", "E", "F");
    $nullRet = false;
    $currentLetter = 0;
    $lastLetter = 0;
    for ($i = 0; $i <= $numDays; $i++)
    {
        if (($i+2) % 7 == 0 || ($i+1) % 7 == 0)
        {
            $nullRet = true;
            continue;
        }
        else
        {
            $nullRet = false;
            $lastLetter = $currentLetter;
            $currentLetter++;
        }
    }
    if ($nullRet)
    {
        return "null";
    }
    else
    {
        return $letters[$lastLetter%6];
    }
}
?>

你能自己算出日期吗?从这里开始很容易。这个想法是,你想在一周中的几天里循环,跳过sat和sun。你在所有其他日子里递增,并检查它们是什么mod 6。

echo get_letter('29-4-2013');
echo get_letter('30-4-2013');
echo get_letter('1-5-2013');
echo get_letter('2-5-2013');
echo get_letter('3-5-2013');
echo PHP_EOL.'------------------'.PHP_EOL;
echo get_letter('6-5-2013');
echo get_letter('7-5-2013');
echo get_letter('8-5-2013');
echo get_letter('9-5-2013');
echo get_letter('10-5-2013');
function get_letter($set_date){
$map=array('a','b','c','d','e','f');
$start_letter = 'c';
$start_date = strtotime("22-4-2013");
$target_date = strtotime($set_date);
$start_date_w = date('w',$start_date);
$target_date_w = date('w',$target_date);
if($target_date_w == 6 || $target_date_w == 0){
return 'null';
}
$bwt_d = ($target_date-$start_date) / 86400;
$week_count =  floor($start_date_w + $bwt_d /7)-1;

$bwt_d5 = $bwt_d -$week_count*2;
$aa=($bwt_d5+1)%6;

return $map[$aa];
}

试试看http://sandbox.onlinephpfunctions.com/code/295d52d2ef2ecdbd7c2d2b93c747254e864fdf9c