2017-12-21 23 views
1

날짜 범위를 기반으로 컬렉션에 항목을 복제하려고합니다. 예를 들어, JSON이 다음과 같습니다.Laravel Collection push()가 제대로 작동하지 않습니다.

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

12시 20 분에서 12시 25 분까지 6 일이므로 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(); 

하지만 내가 가진 유일한 출력은 6 배를 반복한다는 것입니다 마지막 날짜 인 "2017-12-25"에 따라 이처럼 :

{ 
"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 
} 

답변

3

문제는 :

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

$newpush 방법에 참조로 전달되고, 또는 일부가 말을 참고로 할당 : 또 다른 상황을 설명한다.

그건 당신의 경우에 일어나고있는 마법입니다.이를 해결하기 위해서는 $new이라는 복제 된 객체를 푸시해야합니다.

당신은 여기에 push 코드를 추적 할 수 있습니다 : https://github.com/laravel/framework/blob/5.5/src/Illuminate/Support/Collection.php#L1129

변경 $events->push($new);

+0

$events->push(clone $new);에 젠장, 당신에게 사람을 감사합니다. 그리고 설명에 감사드립니다. –

+0

당신을 진심으로 환영합니다. :) – Wreigh