Warum ändern sich meine Werte in der foreach-Schleife??

MajorTom

Praktikant
Beiträge
8
Likes
22
Punkte
3
Hey Leute,

ich hab da mal ne Frage zu PHP und ich kapier das echt nicht. Ich hab so ne foreach-Schleife und irgendwie ändern sich die Werte da drin plötzlich und ich weiß nicht, warum. 😅

Also ich hab ein Array mit Zahlen:

Code:
$zahlen = [1, 2, 3, 4, 5];

Dann mach ich ne Schleife:

Code:
foreach ($zahlen as $zahl) {
 $zahl += 10;
 echo $zahl . " ";
}

Ich dachte, das würde die Zahlen einfach nur um 10 erhöhen und ausgeben. Aber wenn ich nach der Schleife das Array ausgebe, sind die Zahlen immer noch gleich wie vorher! Warum passiert das? Ich dachte, $zahl ist doch eine Referenz auf die Elemente im Array, oder?? 😕

Hab ich was falsch verstanden oder überseh ich was? Freu mich auf eure Tipps!

LG,
MajorTom
 
Beste Antwort
Hallo,

innerhalb der Schleife arbeitest du mit einer Kopie, die Kopie veränderst du und gibst das dann aus. Du überschreibst aber nirgends das Original im Array.

Das kannst du mit der Nutzung von Referenzen lösen, das würde dann so aussehen:

PHP:
foreach($zahlen as &$zahl) {
    $zahl += 10;
}
unset($zahl);

Jetzt handelt es sich bei $zahl nicht mehr um eine Kopie, sondern um eine Referenz auf das Original, sodass sich alle Änderungen auch immer direkt auf das Original beziehen. Damit sollte man übrigens vorsichtig sein; besonders als Anfänger kann man damit unglaublich viele Fehler produzieren, die man später kaum wiederfindet.
Außerdem solltest du anschließend immer unset verwenden. Willst du nämlich später irgendwie erneut mit...
Hallo,

innerhalb der Schleife arbeitest du mit einer Kopie, die Kopie veränderst du und gibst das dann aus. Du überschreibst aber nirgends das Original im Array.

Das kannst du mit der Nutzung von Referenzen lösen, das würde dann so aussehen:

PHP:
foreach($zahlen as &$zahl) {
    $zahl += 10;
}
unset($zahl);

Jetzt handelt es sich bei $zahl nicht mehr um eine Kopie, sondern um eine Referenz auf das Original, sodass sich alle Änderungen auch immer direkt auf das Original beziehen. Damit sollte man übrigens vorsichtig sein; besonders als Anfänger kann man damit unglaublich viele Fehler produzieren, die man später kaum wiederfindet.
Außerdem solltest du anschließend immer unset verwenden. Willst du nämlich später irgendwie erneut mit einer Variable $zahl arbeiten, wäre das sonst immer noch eine Referenz, auch damit kann man unglaublich fiese Bugs fabrizieren, die sich nur schwer finden lassen. Mit unset geben wir die Variable wieder frei.
 
In PHP ist die foreach-Schleife so gebaut, dass die Variable, die du in der Schleife benutzt, standardmäßig keine Referenz ist. Das bedeutet, $zahl ist einfach eine Kopie des Wertes, nicht der Wert selbst im Array. Wenn du das Array wirklich ändern willst, musst du eine Referenz verwenden. So geht's:

Code:
foreach ($zahlen as &$zahl) {
 $zahl += 10;
 echo $zahl . " ";
}

Das & vor $zahl sorgt dafür, dass du direkt auf die Array-Elemente schreibst. Ohne das & arbeitest du nur mit einer Kopie der Werte. PHP ist da ein bisschen anders als vielleicht andere Sprachen, die du kennst.
 
Hey,

ich kenn das Gefühl, wenn man denkt, dass die Werte in der foreach-Schleife verändert werden und dann ist alles anders als erwartet. 😅 Ich hab auch mal gedacht, dass $zahl eine Referenz ist, aber das ist nicht so. In PHP wird bei foreach normalerweise eine Kopie des Werts erstellt, nicht eine Referenz. Deshalb ändert sich das Original-Array nicht.

Wenn du wirklich die Werte im Array ändern willst, kannst du das mit einer Referenz machen. Dazu einfach ein & vor $zahl setzen, so:

Code:
foreach ($zahlen as &$zahl) {
 $zahl += 10;
 echo $zahl . " ";
}

Dann sollten sich die Werte im Array auch wirklich ändern. Aber pass auf, dass du die Referenz nicht vergisst, sonst gibt's komische Fehler.

Hoffe, das hilft dir weiter! Ich hab das auch erst nach ein bisschen Rumprobiererei gecheckt. 😅

Viel Erfolg!
 
Zurück
Oben