Ande Caleb
Ande Caleb

Reputation: 1204

Carbon\Carbon giving me issues

hello i'm trying to build an application that plots a graph for the last 7 days beginning with today, and i'm using Laravel 5 - Carbon\Carbon date package.. so if today is wednesday it would end on tuesday if today is friday it would end on thurdsay nxt week

    $now = Carbon::now();

    $ar = [];
    for($i=1; $i<7; $i++){
        array_push($ar, $now->subDays($i));
    }

    pr($ar, true);

where pr() is a helper function similar to dd() i wrote that just die-dumps in a simple way, but i get this output, with the first problem being that, keeping in mind that today is - Friday, 30th November, 2018, 2018-11-30

Array(
[0] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[1] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[2] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[3] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[4] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

[5] => Carbon\Carbon Object
    (
        [date] => 2018-11-09 12:23:53.793501
        [timezone_type] => 3
        [timezone] => UTC
    )

it should continue as 29th, 28th, 27th, but its going far back as 09th of november, and its not even sequencial, like 09, 08, 07, 06, just 09 of november and i dont know what i'm getting wrong, please i need assistance, thanks.

Upvotes: 1

Views: 1852

Answers (3)

Sabyasachi Ghosh
Sabyasachi Ghosh

Reputation: 1500

$day = Carbon::today();

$ar = [];

for($i=1; $i<=7; $i++){
 array_push($ar, $day);
 $day->subDay(1);
}

Here $day->subDay(1); method is modifying the object value itself subtracting by 1 instead of returning the modified value.

Upvotes: 2

localroot
localroot

Reputation: 556

$ar = [];
for($i=1; $i<7; $i++){
    $now = Carbon::now();
    $ar[] = $now->subDays($i);
}

Carbon will update it's instance everytime you call subdays, so you need to reninitilize.

Upvotes: 0

Jerodev
Jerodev

Reputation: 33216

When you use a function on a carbon object, the object will update itself and return a reference to the object. So, your $ar array contains several references to the same object. Every time you use subDays you are actually updating every object in your array.

If you want to fill your array with different carbon objects, you have to create a new instance every time. For example, like this:

$ar = [];
for($i=1; $i<7; $i++){
    array_push($ar, now()->subDays($i));
}

now() is a helper function in Laravel that returns a new instance of Carbon::now().

Upvotes: 3

Related Questions