web-dev-qa-db-ja.com

Carbonで日付を増やす

Laravel 4.で予約システムのブラックアウト日付の配列を作成しようとしています。2016-01-24のstart_dateおよび2016- 01-29。

これは、行を取得し、Carbonを使用して日付をループして1日ずつ増分し、配列に追加するコードです。

$reserved = Reservation::where('property_id', $property->id)->get();

$blackoutDays = [];

foreach($reserved as $r)
{
    $start = new \Carbon\Carbon($r->start_date);
    $end = new \Carbon\Carbon($r->end_date);
    $days = $start->diff($end)->days;

    for($i = 0; $i <= $days; $i++)
    {
        $date = '';
        $date = $start->addDays($i);

        $blackoutDays[] = $date->format('Y-m-j');
    }
}

私が$ blackoutDaysで取得しようとしているのは:

["2016-01-24"、 "2016-01-25"、 "2016-01-26"、 "2016-01-27"、 "2016-01-28"、 "2016-01-29"]

しかし、私が実際に得ているのはこれです:

["2016-01-24"、 "2016-01-25"、 "2016-01-27"、 "2016-01-30"、 "2016-02-3"、 "2016-02-8"]

誰がこれが起こっているのか/それを修正する方法を知っていますか?これを行うより良い方法はありますか?

12
Kevin Daniel

Forループの実行ごとに$iをインクリメントします。したがって、最初の実行で1日、2回目の実行で2日、3回目の実行で3日というように追加されます。

したがって、交換したい

$date = $start->addDays($i);

$date = $start->addDays(1);

おそらくピットに陥ったのは、呼び出しごとに$start日付オブジェクトから日が追加されるという考えですが、このオブジェクトは「 Immutable 」ではないため、そうではありません。

23
ArSeN

よりクリーンな結果を得るには、addDay()メソッドを使用できます。

$date = $start->addDay();

しかし、実際にはこれはまったく同じです。 addDay()メソッドのソースコード:

/**
 * Add a day to the instance
 *
 * @param int $value
 *
 * @return static
 */
public function addDay($value = 1)
{
    return $this->addDays($value);
}
2
Odin Thunder