dedlfix: Update eines arrays

Beitrag lesen

Tach!

Mit der jetzt realisierten (umständlichen) Version kann ich einen Wert ändern oder löschen.
Die anderen Vorschläge beziehen sich, falls ich es richtig verstanden habe
entweder auf das Update:
foreach ($array as $key => &$value)
oder auf das Löschen:
foreach ($array as $key => &$value)

Nochmal zum Verständnis der Problematik. Die einfachste Variante von foreach liefert dir nur den Wert des aktuellen Array-Element.

1a)  foreach ($array as $value)

In $value steht eine Kopie dieses Wertes. Deswegen nützt es dir nichts, wenn du diese Kopie änderst oder löschst, weil du darüber weder den eigentlichen Wert ändern noch das gesamte Element löschen kannst. Du benötigst für das eigentliche Element den Key, um über $array[$key] direkt den Wert ändern zu können oder auch das Element mit unset() zu entfernen. Deswegen gibt es die zweite foreach-Variante:

2a)  foreach ($array as $key => $value)

Diese liefert dir ebenfalls den Wert als Kopie und zusätzlich den Key. Damit hast du jetzt die Möglichkeiten über $value nur lesend auf den Wert zuzugreifen und über $array[$key] schreibend und löschen, aber auch lesend, wenn du willst. Doch für das Lesen ist jedoch $value einfacher als $array[$key] zu notieren.

Im Laufe der Zeit wurde in PHP dann noch die Variante mit der Referenz hinzugefügt.

1b)  foreach ($array as &$value)

Damit ist $value nun keine Kopie mehr sondern ein direkter Verweis auf den Wert. Darüber kannst du den Wert direkt mit einer Zuweisung an $value ändern. Aber du kannst damit nicht das Element löschen, weil du mit unset($value) nur $value selbst löschst, also nur den Verweis, aber nicht den eigentlichen Wert. Zum Löschen brauchst du immer noch den Key. Und dafür gibt es dann die Key-Value-Variante von foreach zusammen mit der Referenz-statt-Kopie-Schreibweise.

2b)  foreach ($array as $key => &$value)

Du kannst nun über $array[$key] lesend, schreibend und löschend zugreifen, über $value immerhin noch lesend und schreibend.

Wie ich beides in einer loop machen kann habe ich nicht gefunden (übersehen?)

Diese letzte Variante ist also das non-plus-ultra, aber mit Variante 2a kämest du auch schon ans Ziel.

Das sind die von PHP direkt vorgesehenene Wege, foreach auf ein Array anzuwenden. Da 1UnitedPower nicht wusste (und ich hätte es zunächst wohl auch nicht anders gemacht), dass du nicht nur schreibenden Zugriff benötigst, sondern auch löschen willst, war Variante 1b zunächst ausreichend, sonst wäre sicher gleich Variante 2a oder 2b ins Spiel gekommen. - Fred hat hingegen einen ungewöhnlichen Weg gewählt. Die Bedingung, um lesend, schreibend und löschend zugreifen zu können, ist ja der Key, und da die Funktion array_keys() alle Keys als (ein neues) Array liefert, nahm er diese Funktion. Die muss aber zunächst einmal selbst über das Array laufen, alle Keys einsammeln und sie in einem neuen Array ablegen. Dann läufst du mit foreach über dieses Array und über $array[$key] stehen dir alle Möglichkeiten offen. Es ist aber mit den direkten Varianten 2a und 2b nicht notwendig, zweimal über das Array zu laufen, weil diese gleich beim ersten/einzigen/eigentlichen Durchlauf alle Notwendige bereitstellen.

dedlfix.