我正在尝试显示除星期日之外的星期几列表。列表中的第一天应该是今天的任何一天,CSS类为“active”。如果今天=星期日,第一个列表项应该是星期一。
以下是我正在使用的代码。问题是,这将从今天(包括星期日)开始输出前6天,然后从今天开始输掉第7天。
知道我需要改变什么才能让它在周日跳过?
function daysofweek() {
$datetime = new \DateTime();
$listItem = array('<li class="active"><a href="#', '" data-toggle="tab">', '</a></li>');
$i = 0;
echo '<ul class="nav nav-tabs">';
while (true) {
if ($i === 6) break;
if ($datetime->format('N') === '7' && $i === 0) {
$datetime->add(new \DateInterval('P1D'));
continue;
}
$the_day = $datetime->format('D');
echo $listItem[0] . $the_day . $listItem[1] . $the_day . $listItem[2];
$listItem = array('<li><a href="#', '" data-toggle="tab">', '</a></li>');
$datetime->add(new \DateInterval('P1D'));
$i++;
}
echo '</ul>';
}
答案 0 :(得分:2)
这是一种不好的编码方式
while(true)
此ALWAYS评估为true。即使使用break
,这也是一种糟糕的语法。您的while
应该包含逻辑。所以这是你的代码,重组了。我删除了对add()
的重复调用,并使其在每次迭代时都运行。循环自然也会终止。
$i = 0;
while($i < 7) {
$the_day = $datetime->format('N');
if($the_day != 7) {
echo $listItem[0] . $the_day . $listItem[1] . $the_day . $listItem[2];
$listItem = array('<li><a href="#', '" data-toggle="tab">', '</a></li>');
}
$datetime->add(new \DateInterval('P1D'));
$i++;
}
答案 1 :(得分:1)
我更喜欢创建一个返回数组的函数,而不是在其中写入输出。我先解释一下:
time
功能。date
的{{1}}函数作为第一个参数。它将在星期日通过'w'
返回0
星期六。6
添加当前日期。那将是86,400秒或从当前时间开始的1天。值(24 * 60 * 60)
表示小时,第一个24
表示分钟,最后一个60
表示秒。60
的{{1}}函数(字母date
的小写字母)作为第一个参数。Nuff说,这是函数:
'l'
如果您希望在列表末尾不重复当天,则应将L
更改为function weekDaysFromToday() {
$days = array();
$date = time();
while (count($days) < 7) {
$date += (24 * 60 * 60);
if (!date('w', $date)) continue;
$days[] = date('l', $date);
}
return $days;
}
。
这是使用上面代码渲染数组的代码:
while (count($days) < 7)
你有,希望它有所帮助。
答案 2 :(得分:0)
这种格式更加简洁:
$today = date('w');
$first = 1;
for($i=$today; $i<$today+7; $i++){
if($i%7) echo "<li ".($first ? "class='active'" : '').">".date('D', strtotime("Sunday +".($i%7)." days"))."<li>";
$first=0;
}
它的工作方式是使用模%7
来循环一周,从今天开始。