ジョン・コンデの答えは正しいですが、ここでは、より効率的かつMathyさんのソリューションです:
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
$days = $start->diff($end, true)->days;
$sundays = intval($days/7) + ($start->format('N') + $days % 7 >= 7);
echo $sundays;
は私があなたのためにそれを打破してみましょう。
$start = new DateTime('2013-01-06');
$end = new DateTime('2013-01-20');
まず、強力なビルトインされているPHPオブジェクト一部DateTimeのオブジェクトは、問題のまさにこの種のもので作成します。
$days = $start->diff($end, true)->days;
次に、(2番目のパラメータは、この値は常にポジティブであることを保証し、ここでtrue
を渡す)$start
から$end
に違いを見つけるためにDateTime::diffを使用し、それらの間の日数を取得します。
$sundays = intval($days/7) + ($start->format('N') + $days % 7 >= 7);
ここは大きなものですが、それほど複雑ではありません。まず、毎週1つの日曜日があることを知っています。したがって、intval
で最も近いint
に切り捨てられて、少なくとも$days/7
日曜日があります。
これに加えて、1週間未満の日曜日があります。たとえば、次週の金曜日から月曜日には4日間が含まれます。それらの1つは日曜日です。それで、私たちがいつ始まり、終わるかによって、別のものが存在する可能性があります。これが占めるのは簡単である:(DateTime::formatを参照)
$start->format('N')
は1から7までの数で開始日、(1は月曜日で、7は日曜日)のために私たちに週のISO-8601日を与えます。
$days % 7
は、週に均等に分割されない残存期間の日数を示します。
開始日と残存日数が合計して7以上になると、日曜日に届きました。そのことを知っているならば、その式を追加するだけでよいのですが、それが真の場合は1
、偽ならば0
、それはint
の値に加算されるためです。
あなたはそれを持っています!この方法の利点は、与えられた時間の間に毎日繰り返し実行する必要がなく、日曜日かどうかを確認する必要がないため、計算量が大幅に節約され、見た目も本当に賢くなります。希望が助けてくれる!
は、あなたがそのような日付文字列にforループを使用することはできますか? – andrewsi
そのような文字列をインクリメントすることはできません。どのように他の人がそれを見てください:http://stackoverflow.com/search?q=php+number+of+sundays –
これは[projectユーラー問題(19)]ですか?(http://projecteuler.net/problem=19 )? – HamZa