ループに対するあなたの嫌悪感は理解できませんが、コードをできるだけ隠していることは理解しています。
そのために、PHP のDateTimeオブジェクトを拡張して、必要な機能を提供します。このようなもの:-
class MyDateTime extends DateTime
{
/**
* Creates an array of date strings of all days between
* the current date object and $endDate
*
* @param DateTime $endDate
* @return array of date strings
*/
public function rangeOfDates(DateTime $endDate)
{
$result = array();
$interval = new DateInterval('P1D');
//Add a day as iterating over the DatePeriod
//misses the last day for some strange reason
//See here http://www.php.net/manual/en/class.dateperiod.php#102629
$endDate->add($interval);
$period = new DatePeriod($this, $interval, $endDate);
foreach($period as $day){
$result[] = $day->format('Y-m-j');
}
return $result;
}
}
次に、それを使用したいときに、これを行うことができます:-
$st_date = new MyDateTime("2012-07-20");
$en_date = new DateTime("2012-07-27");
$dates = $st_date->rangeOfDates($en_date);
var_dump($dates);
次の出力が得られます:-
array
0 => string '2012-07-20' (length=10)
1 => string '2012-07-21' (length=10)
2 => string '2012-07-22' (length=10)
3 => string '2012-07-23' (length=10)
4 => string '2012-07-24' (length=10)
5 => string '2012-07-25' (length=10)
6 => string '2012-07-26' (length=10)
7 => string '2012-07-27' (length=10)
残念ながら、おそらくその配列を反復処理するにはループが必要になるでしょう:)
明らかに、このソリューションは目的を達成するためにループを使用しますが、ループは再利用可能な優れたコードにカプセル化されています。
詳細については、 DateTime、DateInterval、およびDatePeriodに関する PHP マニュアルを参照してください。それらのページへのコメントには多くのヒントがあります。