PHP循环遍历月份数组

22

这应该很简单,但我遇到了麻烦...

在PHP中,如何输出一个选择下拉框,使其默认显示当前月份,并提供8个月前的选项(即使它跨越了去年)。

例如,对于本月,它将默认为6月,并以11月结束。

9个回答

40
$months = array();
for ($i = 0; $i < 8; $i++) {
    $timestamp = mktime(0, 0, 0, date('n') - $i, 1);
    $months[date('n', $timestamp)] = date('F', $timestamp);
}

使用“自定义”月份名称的替代方案:

$months = array(1 => 'Jan.', 2 => 'Feb.', 3 => 'Mar.', 4 => 'Apr.', 5 => 'May', 6 => 'Jun.', 7 => 'Jul.', 8 => 'Aug.', 9 => 'Sep.', 10 => 'Oct.', 11 => 'Nov.', 12 => 'Dec.');
$transposed = array_slice($months, date('n'), 12, true) + array_slice($months, 0, date('n'), true);
$last8 = array_reverse(array_slice($transposed, -8, 12, true), true);

将这样的月份数组输出为下拉选项框很简单:

<select name="month">
    <?php
        foreach ($months as $num => $name) {
            printf('<option value="%u">%s</option>', $num, $name);
        }
    ?>
</select>

18

如果您需要像选择框选项一样打印,请尝试使用以下方法:

for($i=1;$i<13;$i++)
print("<option>".date('F',strtotime('01.'.$i.'.2001'))."</option>");

12
$months = array(
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July ',
    'August',
    'September',
    'October',
    'November',
    'December',
);

$current = date('F');
$start = array_search($current, $months);

$toshow = array();
$total = 0;
for($i = $start; $total < 8; $i--)
{
    if($i == 0)
    {
        $i = 12;
    }

    $toshow[] = $months[$i];
    $total++;
}

var_dump($toshow);

试试这个,只需将 $toshow 输出到你的 HTML 中即可。


4

使用for循环和PHP date函数获取月份名称的另一种简单方法。

<?php
   for($m=1; $m<=12; ++$m){
     echo date('F', mktime(0, 0, 0, $m, 1)).'<br>';
}

3

这完全基于deceze的答案,只是月份是倒序排列,当前月份被选中。

  $curr_month = date('F',mktime(0, 0, 0, date('n')));
  $months = array();

 for ($i = 1; $i <= 8; $i++) {
 $months[] = date('F', mktime(0, 0, 0, date('n') - $i, 1));
 }
  $months = array_reverse($months, true);

echo "<select>\n";
foreach($months as $key =>$value){
       echo "<option value='$value'>$value</option>\n";
                                  }

 echo "<option value='$curr_month' selected='selected'>$curr_month</option>
  </select>";

为什么要将它们倒序排序,那看起来很奇怪啊。 - Lawrence Cherone
不,那样看起来不对 - 一月到二月等,而不是二月到一月等。原始数组中的月份计数是从当前月份开始向后推8个月。 - AR.

3

以下是一些函数...在页面加载时,将选择当前天、月、年,并包括您需要的前8个月

<form method="POST" action="">
<p><select size="1" name="day">
<?php formDay(); ?>
</select>-
<select size="1" name="month">
<?php formMonth(); ?>
</select>-
<select size="1" name="year">
<?php formYear(); ?>
</select> <input type="submit" value="Submit"></p>
</form>

<?php
//functions to loop day,month,year
function formDay(){
    for($i=1; $i<=31; $i++){
        $selected = ($i==date('n'))? ' selected' :'';
        echo '<option'.$selected.' value="'.$i.'">'.$i.'</option>'."\n";
    }
}
//with the -8/+8 month, meaning june is center month
function formMonth(){
    $month = strtotime(date('Y').'-'.date('m').'-'.date('j').' - 8 months');
    $end = strtotime(date('Y').'-'.date('m').'-'.date('j').' + 8 months');
    while($month < $end){
        $selected = (date('F', $month)==date('F'))? ' selected' :'';
        echo '<option'.$selected.' value="'.date('F', $month).'">'.date('F', $month).'</option>'."\n";
        $month = strtotime("+1 month", $month);
    }
}

function formYear(){
    for($i=1980; $i<=date('Y'); $i++){
        $selected = ($i==date('Y'))? ' selected' :'';
        echo '<option'.$selected.' value="'.$i.'">'.$i.'</option>'."\n";
    }
}
?>

0

之前使用了mkdate,但是用4个参数而不是5个参数也可以完成。

<select >
  <option value="">select month</option>
   
   <?php
     for($m=1; $m<=12; $m++){
       echo '<option value="'.$m.'">'.date('F', mktime(0, 0, 0, $m)).'</option>';
     }
   ?>
</select>




0
你可以使用这个函数。我添加了ksort来按照1月到12月的顺序对数组进行排序,而不是依靠运气。
function months($month_format="F"){
    $months =  [];
    for ($i = 0; $i < 12; $i++) {
        $timestamp = mktime(0, 0, 0, date('n') - $i, 1);
        $months[date('n', $timestamp)] = date($month_format, $timestamp);
    }
    ksort($months,SORT_NUMERIC);
    return $months;
}

0
如果您需要将今年一月设置为当前月份,则可以按照以下步骤进行:
    <?php 

    $startMonth = date('1');
    $endtMonth = date('m');
    for($m=$endtMonth ; $m<=$currentMonth; ++$m){
        $months[$m] = strftime('%B', mktime(0, 0, 0, $m, 1));
        echo $months[$m]."<br>";
    }

 ?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接