2016-06-02 12 views
14

Mam kolekcję, którą chcę iterować i modyfikować podczas pobierania niektórych jej elementów. Ale nie mogłem znaleźć sposobu ani metody usunięcia tego pobranego elementu.Jak usunąć (usunąć) element kolekcji po jego pobraniu?

$selected = []; 
foreach ($collection as $key => $value) { 
     if ($collection->selected == true) { 
      $selected[] = $value; 
      unset($value); 
     } 
} 

To tylko reprezentacja mojego pytania do demonstracji.

Po @Ohgodwhy sprawdziłem funkcję forget(), sprawdziłem ją ponownie i zobaczyłem, że naprawdę źle zrozumiałem funkcję. Właśnie tego szukałem. Po dodaniu "$ collection-> forget ($ key)" wewnątrz instrukcji if jak na poniższym demo, zadziałało.

$selected = []; 
foreach ($collection as $key => $value) { 
     if ($collection->selected == true) { 
      $selected[] = $value; 
      $collection->forget($key); 
     } 
} 

(jest to tylko demonstracja)

+1

Sugeruję, aby nie przechowywać elementy w tablicy jednak stworzyć nową kolekcję i dodawania elementów do niego poprzez naciśnięcie. – Amarnasan

+0

@Amarnasan Jak by to było? Nie potrzebuję go teraz, ale myślę, że może będę go potrzebować w przyszłości. –

Odpowiedz

20

co chcesz używać ->forget()

$collection->forget($key); 

Link do forget method documentation

+1

Tak, właściwie źle zrozumiałem(). Myślałem, że parametr $ key usuwa wszystkie podane klucze. teraz mogłem go użyć w pętli z instrukcją if. – Skeletor

+3

'forget()' jest cool w porównaniu do 'delete()' lub 'remove()', ale do diabła, musiałem przyjść tutaj, aby dowiedzieć się, jak usunąć element :) –

+0

co jeśli chcesz usunąć cały obiekt ? –

3

Albo można użyć rejectmethod

$newColection = $collection->reject(function($element) { 
    return $item->selected != true; 
}); 

lub pullmethod

$selected = []; 
foreach ($collection as $key => $item) { 
     if ($item->selected == true) { 
      $selected[] = $collection->pull($key); 
     } 
} 
+1

Ale odrzucone rozwiązanie nie usunie elementów z oryginalnej kolekcji, prawda? – Amarnasan

+0

Tak, zachowuje nienaruszoną oryginalną kolekcję – huuuk

+0

Idealne rozwiązanie dla tego pytania byłoby drugie. – Amarnasan