2017-12-21 10 views
1

Ich versuche, ein Element in einer Sammlung basierend auf dem Datumsbereich zu duplizieren. Zum Beispiel habe ich eine JSON dieses:Laravel Collection push() funktioniert nicht richtig

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

Jetzt möchte ich 6x kopieren, weil es 6 Tage sind 12-20 bis 12-25. Wie folgt aus:

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

ich dies will, weil die Antwort aus meiner vorherigen Frage: Repeat events on FullCalendar base on date start and end

ist hier mein Code:

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

Aber der einzige Ausgang bekam ich ist, dass es 6x wiederholt basierend auf dem letzten Datum "2017-12-25". Wie folgt aus:

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

Antwort

3

Das Problem ist:

$new ein Objekt ist. Die $new, die Sie in diese Sammlung verschoben haben, ist dieselbe $new, die Sie in der nächsten Iteration verwenden werden. Um die Situation zu beschreiben:

$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 wird unter Bezugnahme auf die push Methode übergeben wird, oder manche sagen würden, durch Bezugnahme zugeordnet.

Das ist die Magie, die in Ihrem Fall passiert, um das zu beheben, sollten Sie ein geklontes Objekt von $new drücken.

Sie können die push Code hier verfolgen: https://github.com/laravel/framework/blob/5.5/src/Illuminate/Support/Collection.php#L1129

ändern $events->push($new);-$events->push(clone $new);

+0

Verdammt, danke Mann. Und danke für die Erklärung. –

+0

Gern geschehen. :) – Wreigh

Verwandte Themen