PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   foreach und Referenzierung? (http://www.selfphp.de/forum/showthread.php?t=23503)

Domi 21.08.2010 17:40:45

foreach und Referenzierung?
 
Hallo Zusammen,

verstehe gerade nicht was hier passiert. Folgendes:

früher hätte ich sowas gemacht:

PHP-Code:

foreach ($filme as $key=>$film)
  
$filme[$key] = ucfirst($film); 

nun dachte ich mir, gibst einfach ne Referenz mit und greifst direkt auf den Wert zu:

PHP-Code:

foreach ($filme as &$film)
  
$film ucfirst($film); 

Variante 1 funktioniert, Variante 2 verhält sich merkwürdig:

PHP-Code:

$filme = array('film1''film2'"Film3");

var_dump($filme);

foreach (
$filme as &$film)
  
$film ucfirst($film);

var_dump($filme); 

Ergebnis:

Code:

array(3) {
  [0]=>
  string(5) "film1"
  [1]=>
  string(5) "film2"
  [2]=>
  string(5) "Film3"
}
array(3) {
  [0]=>
  string(5) "Film1"
  [1]=>
  string(5) "Film2"
  [2]=>
  &string(5) "Film3"
}

wie man sieht ist der 3. Wert vom typ &string.

Wenn ich nun versuche es auszugeben passiert sowas:

PHP-Code:

foreach ($filme as $key=>$film)
  echo 
"$key $film <br />"

Code:

0 Film1
1 Film2
2 Film2

Wie man also sieht hat man jetzt nicht mehr Film 1, 2 und 3, sondern 1, 2 und NOCHMAL 2

Wer erklärt mir nun warum das so ist? Bzw. was ich da nicht verstanden habe? (Ob es Sinn macht in ner foreach die Strings mit ucfirst zu behandeln oder nicht sein mal ganz egal, darum gehts auch gar nicht.)

Freu mich auf Antworten!

Domi

Domi 21.08.2010 22:07:06

AW: foreach und referenzierung?
 
Bin selber zur Lösung gekommen.

PHP-Code:

unset($film); 

nach dem foreach und das ganze Problem ist erledigt. Somit kann der Wert im Array später nicht mehr versehentlich überschrieben werden.

Es steht auch nochmal im manual: http://de2.php.net/manual/en/control...es.foreach.php

Zitat:

Warnung: Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().

DokuLeseHemmung 21.08.2010 22:43:10

AW: foreach und referenzierung?
 
Ekelig!
Ist bei mir auch.... :(

Zitat:

Es steht auch nochmal im manual:
Auch das noch...
Kein Bug, sondern ein Feature.. Grr..

Domi 23.08.2010 10:51:08

AW: foreach und Referenzierung?
 
Mir fällt ehrlich gesagt auch gar kein Fall ein, in welchem mir dieses "Feature" was bringen könnte :)

DokuLeseHemmung 23.08.2010 11:12:17

AW: foreach und Referenzierung?
 
Dank Dir, ist in mir die Einsicht gereift auf Referenzen in Foreach zu verzichten. Mit diesen Seiteneffekten will ich mich nicht rum schlagen müssen. Solche Angelegenheiten werden jetzt nur noch per array_map oder _walk erledigt.

Domi 23.08.2010 11:17:26

AW: foreach und Referenzierung?
 
hab gerade nen Link von den Jungs von phphatesme bekommen: http://schlueters.de/blog/archives/1...d-foreach.html

da versteht man es, was genau passiert! Interessant!

Habe übrigens mal eeeeewig in einem Projekt gesucht warum es falsche Werte liefert. Man geht immerhin davon aus, dass foreach das macht, was man davon erwartet.

cortex 23.08.2010 11:58:37

AW: foreach und Referenzierung?
 
Zitat:

Zitat von DokuLeseHemmung (Beitrag 137628)
[...] ist in mir die Einsicht gereift auf Referenzen in Foreach zu verzichten. Mit diesen Seiteneffekten will ich mich nicht rum schlagen müssen.

dito. war mir dieses problems auch nicht bewusst und werde bestehende codes entsprechend anpassen.

cx

Domi 23.08.2010 20:05:44

AW: foreach und Referenzierung?
 
naja mit dem entsprechenden unset() sollte ja eigtl alles erledigt sein..

CeBe 26.08.2010 01:57:38

AW: foreach und Referenzierung?
 
Also nach dem Lesen des Blogartikels von Johannes Schlüter ist ja ziemlich klar was passiert und warum. Mit dem Wissen ists ne super Sache und problemlos einsetzbar.
Solche Sachen nerven einfach nur:
PHP-Code:

$item[$i]['bla'] = '...'

mich zumindest :-)

MfG
Carsten

cortex 26.08.2010 11:35:39

AW: foreach und Referenzierung?
 
Zitat:

Zitat von Domi (Beitrag 137635)
mit dem entsprechenden unset() sollte ja eigtl alles erledigt sein

und

Zitat:

Zitat von CeBe (Beitrag 137655)
nach dem Lesen des Blogartikels [...] problemlos einsetzbar

foreach verhält sich in verbindung mit referenzen nicht so, wie's der gesunde menschenverstand erwarten würde; das ergebnis muss händisch korrigiert werden. ich persönlich habe damit ein prinzipielles problem. man muss doch nicht alles (mit-)machen, nur weil's sich irgendwie hinbiegen lässt...

schlüter meint dem entsprechend auch:

Zitat:

References in PHP are bad. Do not use them.
quelle: Do not use PHP references

cx


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:20:26 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.