foreach schleife lässt den ersten schlüssel aus ....

projumper

Mitglied
Hallo @ all,

habe ein Problem an dem ich gerade verzweifle.... siehe Überschrift.

Hier mein Code
Code:
foreach($_POST as $value) {
  $sqlUpdate = "update ".$cfg['tab']['tabelle1']." set ".key($_POST)."=".$value." where id=".$this->id;
  echo $sqlUpdate."\n\r";
  next($_POST);
}

Die Ausgabe ist unglaublich. Der erste Eintrag (Index) aus der $_POST ist nicht da. Der $value wird aber richtig gesetzt.

Schiebt die foreach den Arraypointer bereits beim ersten Aufruf weiter? So daß die key() den Index aus bereits nächsten Eintrag nimmt?

Ich stehe irgendwie auf dem Schlauch .....

Hier noch ein paar Ausgaben:

print_r($_POST);

Code:
[frame] => 4
[area] => stb-vereine-edit

echo $sqlUpdate."\n\r";
Code:
update gc_verein set area=4 where idgcuser=1365
update gc_verein set action=stb-vereine-edit where idgcuser=1365

Warum sind die verschoben?

BIn für jede Hilfe sehr dankbar!
 
Zuletzt bearbeitet:
Warum machst du dir denn das Leben so schwer ?
Wesentlich einfacher wäre folgendes:
PHP:
foreach($_POST as $key => $value){
...
}
Damit sparst du dir das aufrufen von key(...) und somit auch das aufrufen von next(...).
Und obendrein funktionierts auch noch. ;)

Folgender Hinweis aus der PHP-Doku sei noch nachgereicht :
Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.
 
Zuletzt bearbeitet:
Total Geil! Vielen Dank für den Tipp. So funktioniert das.

Aber mich würde mal trotzdem interessieren warum dieser Effekt auftratt?

mfg

projumper
 
Naja wie im zitierten Hinweis bereits steht darf man sich nicht auf der array pointer innerhalb einer foreach Schleife verlassen, es sei denn man resetted ihn manuell.

Folgendes Beispiel ohne manuellen Reset :
PHP:
$arr = array("eins"=>1,"zwei"=>2,"drei"=>3,"vier"=>4);

foreach($arr as $val){	
	echo key($arr) . " => " . $val . "<br>";
	next($arr);
}
/*Ausgabe :
zwei => 1
drei => 2
vier => 3
=> 4
*/
Es passiert genau das was bei dir auch passiert ist.

Folgendes Beispiel mit manuellem Reset:
PHP:
$arr = array("eins"=>1,"zwei"=>2,"drei"=>3,"vier"=>4);

foreach($arr as $val){	
	if($val == 1) reset($arr);
	echo key($arr) . " => " . $val . "<br>";
	next($arr);
}
/*Ausgabe :
eins => 1
zwei => 2
drei => 3
vier => 4
*/
Tadaaa ;)
 
[phpf]foreach[/phpf] arbeitet nicht mit dem Array selbst, sondern legt sich intern eine Kopie an.
 
Zurück