【问题标题】:Laravel Collection push() not properly workingLaravel Collection push() 无法正常工作
【发布时间】:2025-12-20 15:35:16
【问题描述】:

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

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

现在我想复制 6x,因为从 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
}

我想要这个是因为我之前的问题的答案:Repeat events on FullCalendar base on date start and end

这是我的代码:

$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();

但我得到的唯一输出是它根据最后一个日期“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
}

【问题讨论】:

    标签: php json laravel collections fullcalendar


    【解决方案1】:

    问题是:

    $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"
    //  }
    //}
    

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

    这就是在你的情况下发生的魔法,要解决这个问题,你应该推送一个$new 的克隆对象。

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

    $events-&gt;push($new); 更改为$events-&gt;push(clone $new);

    【讨论】: