Laravel Collection push()无法正常工作

Vah*_*wan 1 php collections json fullcalendar laravel

我试图根据日期范围在集合中重复一个项目。例如,我有一个这样的JSON:

{
"title": " 200",
"start": "2017-12-20",
"endx": "2017-12-25",
"equipment": "Chairs",
"quantity": 200
}
Run Code Online (Sandbox Code Playgroud)

现在我想复制6倍,因为从12-20到12-25有6天。像这样:

{
"title": " 200",
"start": "2017-12-20",
"endx": "2017-12-20",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-21",
"endx": "2017-12-21",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-22",
"endx": "2017-12-22",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-23",
"endx": "2017-12-23",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-24",
"endx": "2017-12-24",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-25",
"endx": "2017-12-25",
"equipment": "Chairs",
"quantity": 200
}
Run Code Online (Sandbox Code Playgroud)

我想要这个,是因为我之前的问题得到了答案:根据日期的开始和结束在FullCalendar上重复事件

这是我的代码:

$events = Event::all();

        foreach ($events as $i => $event) {
            if($event->start != $event->endx)
            {
                $date = $event->start;
                $end = $event->endx;
                while (strtotime($date) <= strtotime($end)) {
                    $new = [];
                    $new = $event;

                    $new->start = $date;
                    $new->endx = $date;

                    $events->push($new);

                    $date = date ("Y-m-d", strtotime("+1 day", strtotime($date)));
                }
            }
        }

        return $events->all();
Run Code Online (Sandbox Code Playgroud)

但是我得到的唯一输出是它根据最后一个日期“ 2017-12-25”重复6倍。像这样:

{
"title": " 200",
"start": "2017-12-25",
"endx": "2017-12-25",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-25",
"endx": "2017-12-25",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-25",
"endx": "2017-12-25",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-25",
"endx": "2017-12-25",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-25",
"endx": "2017-12-25",
"equipment": "Chairs",
"quantity": 200
}

{
"title": " 200",
"start": "2017-12-25",
"endx": "2017-12-25",
"equipment": "Chairs",
"quantity": 200
}
Run Code Online (Sandbox Code Playgroud)

Wre*_*igh 5

问题是:

$new是一个对象。在$new你已经被推到该集合是一样的$new,你要使用的下一次迭代。为了进一步描述这种情况:

$a = new stdClass;
$a->name = "foo";

$myArray = [$a];

var_dump($myArray);
// array(1) {
//  [0]=>
//  object(stdClass)#1 (1) {
//    ["name"]=>
//    string(3) "foo"
//  }
//}

$a->name = "bar";
var_dump($myArray);
// array(1) {
//  [0]=>
//  object(stdClass)#1 (1) {
//    ["name"]=>
//    string(3) "bar"
//  }
//}
Run Code Online (Sandbox Code Playgroud)

$new通过引用传递给该push方法,或者有人说通过引用分配。

这就是您正在发生的魔术,为了解决此问题,您应该推送的克隆对象$new

您可以在push此处跟踪代码:https : //github.com/laravel/framework/blob/5.5/src/Illuminate/Support/Collection.php#L1129

更改$events->push($new);$events->push(clone $new);