Ich habe eine Sammlung, die ich iterieren und ändern möchte, während ich einige ihrer Elemente abrufe. Aber ich konnte keinen Weg oder keine Methode finden, um dieses abgerufene Element zu entfernen.
$selected = [];
foreach ($collection as $key => $value) {
if ($collection->selected == true) {
$selected[] = $value;
unset($value);
}
}
Dies ist nur eine Darstellung meiner Demonstrationsfrage.
Nach dem Rat von @Ohgodwhy der Funktion compare () habe ich sie erneut überprüft und festgestellt, dass ich die Funktion tatsächlich falsch verstanden habe. Es war genau so, wie ich es gesucht hatte.
Für eine funktionierende Lösung habe ich also $collection->forget($key)
die if-Anweisung hinzugefügt .
Unten ist die funktionierende Lösung meines Problems unter Verwendung der Lösung von @ Ohgodwhy:
$selected = [];
foreach ($collection as $key => $value) {
if ($collection->selected == true) {
$selected[] = $value;
$collection->forget($key);
}
}
(Dies ist nur eine Demonstration)
laravel
collections
Skeletor
quelle
quelle
if
Zustand$collection->selected == true
macht keinen Sinn. Warum die Eigenschaftselected
descollection
Objekts überprüfen, nicht die desvalue
? Wenn sich die Eigenschaft tatsächlich innerhalb befindet,collection
überprüfen Sie sie einmal außerhalb Ihrer Schleife.Antworten:
Sie würden verwenden wollen
->forget()
Link zur Dokumentation zur Vergessensmethode
quelle
forget()
ist cool im Vergleich zudelete()
oderremove()
, aber zur Hölle, ich musste hierher kommen, um herauszufinden, wie man einen Gegenstand entfernt :)forget
Sieindex
das Objekt im Array kennen. Was Sie wollen, ist wahrscheinlichfilter()
Oder Sie können
reject
Methode verwenden$newColection = $collection->reject(function($element) { return $item->selected != true; });
oder
pull
Methode$selected = []; foreach ($collection as $key => $item) { if ($item->selected == true) { $selected[] = $collection->pull($key); } }
quelle
$collection = $collection->reject(...)
überschreibt die ursprüngliche Sammlung mit der neuen Sammlung. Und$collection->pull(...)
ist die beste Lösung, denke ich. Die Themenüberschrift enthält...after fetching it...
. Daspull
macht es.Laravel
Collection
implementiert die PHP-ArrayAccess
Schnittstelle (weshalb die Verwendung überhauptforeach
möglich ist).Wenn Sie den Schlüssel bereits haben, können Sie einfach PHP verwenden
unset
.Ich bevorzuge dies, weil es die vorhandene Sammlung deutlich verändert und leicht zu merken ist.
foreach ($collection as $key => $value) { unset($collection[$key]); }
quelle
Ich bin nicht in Ordnung mit Lösungen, die über eine Sammlung iterieren und innerhalb der Schleife den Inhalt selbst dieser Sammlung manipulieren. Dies kann zu unerwartetem Verhalten führen.
Siehe auch hier: https://stackoverflow.com/a/2304578/655224 und in einem Kommentar den angegebenen Link http://php.net/manual/en/control-structures.foreach.php#88578
Wenn Sie also
foreach
if verwenden, scheint dies meiner Meinung nach in Ordnung zu sein, besteht die viel besser lesbare und einfachere Lösung darin, Ihre Sammlung nach einer neuen zu filtern./** * Filter all `selected` items * * @link https://laravel.com/docs/7.x/collections#method-filter */ $selected = $collection->filter(function($value, $key) { return $value->selected; })->toArray();
quelle
unset($attr['placeholder'], $attr['autocomplete']);
quelle
$collection->forget($item->id)
?