20090101 の開始日と 20091130 の終了日があり、その間のすべての月を構築して配列しようとしています。これは次のようになります。
<?php
/* ... */
$arrDates['Jan'] = 2009;
$arrDates['Feb'] = 2009;
$arrDates['Mar'] = 2009;
/* ... */
?>
これどうやってするの?
20090101 の開始日と 20091130 の終了日があり、その間のすべての月を構築して配列しようとしています。これは次のようになります。
<?php
/* ... */
$arrDates['Jan'] = 2009;
$arrDates['Feb'] = 2009;
$arrDates['Mar'] = 2009;
/* ... */
?>
これどうやってするの?
配列構造がよくわかりません。
しかし、これが役立つかもしれません: PHP 5.3 を使用している場合、以下のようなコードを使用して、指定された範囲内のすべての月のイテレータを取得できます。
<?php
$db = new DateTime( '2009-01-01 00:00:00' );
$de = new DateTime( '2009-11-30 23:59:59' );
$di = DateInterval::createFromDateString( 'first day of next month' );
foreach ( $di as $dt )
{
echo $dt->format( "Y-m\n" );
}
?>
次のスニペットは、そのような配列を作成します。
$startDate = '20090101';
$endDate = '20091130';
$arrDates = array();
$cur = strtotime($startDate);
$end = strtotime($endDate);
while ($cur < $end) {
$arrDates[date('M', $cur)] = date('Y', $cur);
$cur = mktime(0, 0, 0, date('m', $cur) + 1, 1, date('Y', $cur));
}
// If you want to add the 'end' month too...
$arrDates[date('M', $end)] = date('Y', $end);
ただし、danii がコメントしたように、1 年を超えるタイムスパンをどのように処理するかが不明であることに注意してください。上記のコードは、指定した範囲の昨年を単純に使用します。
このコードは、ほぼすべてのバージョンの PHP (PHP 4+) で動作します。より洗練されたソリューションが必要で、PHP 5.2 以降を使用している場合は、GZipp が提供するソリューションをお勧めします。
月をキーとして使用することはできません。キーは一意である必要があります。そうでない場合、範囲が1年を超えると、正しく機能しません。これにより、Mon-Yearをキーとする配列が返されます
function foo($startdate, $enddate) {
// create a timestamp for start date
if(!preg_match('/^(\d{4})(\d{2})(\d{2})$/', $startdate, $m)) die('Invalid start date format');
$start_time = mktime(0, 0, 0, $m[2], $m[3], $m[1]);
// create a timestamp for end date
if(!preg_match('/^(\d{4})(\d{2})(\d{2})$/', $enddate, $m)) die('Invalid end date format');
$end_time = mktime(23, 59, 59, $m[2], $m[3], $m[1]);
// build the array of months by incrementing $start_time by one month through each iteration
$ret = array();
while($start_time < $end_time) {
$ret[date('M-Y', $start_time)] = date('Y', $start_time);
$start_time = strtotime(date('m/d/Y', $start_time).' +1month');
}
return $ret;
}
$arrDates = foo('20090101', '20111130');
print_r($arrDates);
Array(
[Jan-2009] => 2009
[Feb-2009] => 2009
[Mar-2009] => 2009
[Apr-2009] => 2009
[May-2009] => 2009
[Jun-2009] => 2009
[Jul-2009] => 2009
[Aug-2009] => 2009
....
)
「間の月」と言っていますが、あなたの例には開始月が含まれているため、「間の月と開始月と終了月」を意味すると思います。
$dt_start = new DateTime('20090101');
$dt_end = new DateTime('20091130');
$arrDates[] = $dt_start->format('M');
while ($dt_start->modify('first day of next month') <= $dt_end) {
$arrDates[] = $dt_start->format('M'); // Or whatever you want to do with it.
}
(これは基本的にヨハネスのソリューションであり、PHP 5.2 に適応させるために少しマニュアルを読んでいます。)
旅行代理店用に構築していたウェブサイトでも同様の状況がありました。タイムスタンプ、配列、ループが必要です。PHP が提供する日付関数を見てみましょう。日付を操作するための興味深いオプションがいくつかあります。たとえば、いいえ。指定された月の日数。
少し複雑ですが、機能します...:
function buildDateRange($strStartDate, $strEndDate)
{
$strStartM = date('M', $strStartDate);
$strStartY = date('Y', $strStartDate);
$strEndM = date('M', $strEndDate);
$strEndY = date('Y', $strEndDate);
$intCurMN = date('m', $strStartDate);
$ii = 0;
$blnFinished = FALSE;
while(!$blnFinished)
{
$strCurM = date('M', mktime(0, 0, 0, $intCurMN , "01", $strStartY));
$strCurY = date('Y' ,mktime(0, 0, 0, $intCurMN , "01", $strStartY));
$arrSearchDates [$strCurM] = $strCurY;
$intCurMN = date('m', mktime(0, 0, 0, $intCurMN+1 , "01", $strStartY));
if($strEndM == $strCurM && $strEndY == $strCurY)
{
$blnFinished = TRUE;
}
}
Return ($arrSearchDates);
}