2014-04-03 64 views
0

有沒有一種方法可以使用PHP循環根據當前月份(不包括當前月份)創建類似於以前12個月的列表? 值應該始終是第一個月(格式:YYYY-MM-DD),並且下拉本身應該只顯示年份和月份(格式:YYYY-MM):PHP:循環創建前12個月的列表

<option value="2014-03-01">2014-03</option> 
<option value="2014-02-01">2014-02</option> 
<option value="2014-01-01">2014-01</option> 
<option value="2013-12-01">2013-12</option> 
<option value="2013-11-01">2013-11</option> 
<option value="2013-10-01">2013-10</option> 
//... 

我嘗試以下,但似乎有什麼不對勁的地方,因爲這是不工作:

<?php for ($i=0; $i<=12; $i++) { ?> 
    <option value="<?php echo date('Y-m-d', strtotime("-1 month")); ?>"><?php echo date('Y-m', strtotime("-1 month")); ?></option> 
<? } ?> 

與此的任何幫助,蒂姆非常感謝。

+3

'-1'應該是' - $ i' –

+0

謝謝。使用這種方式時,我得到以下內容:解析錯誤:語法錯誤,意外$ end ...我可以使用兩個日期格式$ i月嗎? – user2571510

+0

作爲答覆者添加到下面 –

回答

2
<?php 
for ($i=0; $i<=12; $i++) { 
echo '<option value="'.date('Y-m-d', strtotime("-$i month")).'">'.date('Y-m', strtotime("-$i month")).'</option>'; 
} 
+0

這工作完美。它錯過了PHP的結局,但除此之外它很棒 - 非常感謝! – user2571510

+0

它沒有丟失,它不是必需的,在這種情況下它是'文件'中唯一的代碼 –

+0

我看到了 - 謝謝! – user2571510

4
$start = (new DateTime('1 year ago'))->modify('first day of this month'); 
$end  = (new DateTime())->modify('first day of this month'); 
$interval = new DateInterval('P1M'); 
$period = new DatePeriod($start, $interval, $end); 

$months = array(); 
foreach ($period as $dt) { 
    $months[$dt->format('Y-m-d')] = $dt->format('Y-m'); 
} 
$reverse_months = array_reverse($months); 
print_r($reverse_months); 

Demo

然後,您可以遍歷$ reverse_months來創建下拉

foreach($reverse_months as $key => $value) { 
?> 
    <option value="<?php echo key; ?>"><?php echo value; ?></option> 
<?php 
} 

我們之所以要使用array_reverse()是DatePeriod只是前進中的時間。

+0

也謝謝你。我將使用上述,因爲這需要添加更少的代碼。 – user2571510

-2

將-1更改爲$i以反映並存儲它以供雙重使用。

<?php 
    for ($i=1; $i>=12; $i++) { 
     $last = strtotime("-$i month"); 
?> 
    <option value="<?php echo date('Y-m-d', $last);?>"><?php echo date('Y-m', $last);?></option> 
<? } ?> 
+0

這不是什麼op查找 – Fabio

+0

@Fabio更新。 –

2

可以使用datetime擴展來創建一個迭代器。這是很簡單的:

// This is when to start counting 
$start = new DateTime('now'); 

// The interval; i.e. every time we iterate we should get 
// the first day of the previous month 
$interval = DateInterval::createFromDateString('first day of last month'); 

// The period (or the iterator) should go for twelve 
// months and the start date should not be included 
$period = new DatePeriod($start, $interval, 12, DatePeriod::EXCLUDE_START_DATE); 

// The DatePeriod class implements the Traversable 
// interface and can therefore be used in a foreach loop 
foreach($period as $time) { 
    $val = $time->format("Y-m-d"); 
    $txt = $time->format("Y-m"); 
    echo "<option value=\"{$val}\">{$txt}</option>\n"; 
} 
1

這是我用過的東西,它是一個有點簡陋,但作爲Glavić指出,當你到了月底的作品甚至..不像接受的答案:

<?php 
$year = date("Y"); 
$month = date("m"); 
for ($i=0; $i<=12; $i++) 
{ 
    $month--; 
    if ($month < 1) { $month = 12; $year--; } 
    echo '<option value="'.date('Y-m-d', strtotime($year."-".$month."-01")).'">'.date('Y-m', strtotime($year."-".$month."-01")).'</option>'; 
}