次の方法で foreach を使用していることに気付いた同僚がいます。
foreach ($var as $var) {
// do stuff here
}
上記のコードをテストしたところ、驚いたことに正しく動作しました。PHP の達人は飛び込んで、なぜこれが間違っているのか教えてくれませんか? それは非常に間違っていると感じます。
の値が変わるからです$var
。その後、foreach()
配列ではなくなりましたが、配列の最後の値に設定されます。
$var = array('apple', 'orange');
foreach ($var as $var) {
echo $var."<br/>";
}
echo $var; //orange
変数の値を変更したくない場合は、別の変数名にする必要があります。
$var = array('apple', 'orange');
foreach ($var as $fruit) {
echo $fruit."<br/>";
}
echo $var; //array
@UselessIntern が指摘したように、ループ後に変数を使用しない場合は問題ありませんが、混乱を招く可能性があるため、絶対にお勧めできません。
@PLB が指摘したように、$var
not$var
自体のコピーを反復処理します。したがって、反復ごとに値$var
が変化しますが、作成されたコピーをループしているため、ループは中断されません。
$var
あなたの同僚は、ループ後の配列としてはもう必要ないようです。$var
PHP が foreach ループを初期化するとき (これは 1 回だけ行われます) 、現時点では配列であるため、元の値を使用します。次に、ループ内のすべてのステップで、要素の現在の要素が という新しい変数に割り当てられvar
ます。$var
元の配列はもう存在しないことに注意してください。ループの後、$var
元の配列の最後の要素の値が取得されます。
私が言ったことを示すこの小さな例をチェックしてください:
$a = array(1,2,3);
foreach($a as $a) {
echo var_dump($a);
}
// after loop
var_dump($a); // integer(3) not array
配列への参照が上書きされ、ガベージコレクターが次の実行時にメモリを削除するため、同僚がこれを行ってメモリを少し節約していることを想像できますが、読みにくいため、同じことを行うことはお勧めしません.
以下を実行するだけです。これは同じですが、はるかに読みやすくなっています。
$array = array(1,2,3);
foreach($array as $value) {
echo var_dump($value);
}
delete($array);
delete($value);
ループだから。実行:
array > string
array > string
そう
foreach ($var AS $var){
/*
Is basically being re-read at the end so your foreach can read the array again to get the next step of the array
array > string
recheck array > string
recheckarray > string
*/
}
次の式を確認してください。
$x = array(1,2,3);
foreach ($x as $x) {
echo $x; //prints 123
}
ここで起こっていることは、foreach
が配列の最初の要素を抽出し、それ自体$x
にオーバーライドする$x
ことです。ただし、キーワード$x
の左側にあった配列変数は、引数の内部スコープに残っているため、ループは問題なく機能します。as
foreach
ループが完了する$x
と、(配列)の内部にあったforeach
はスコープを失い、存在しなくなります。残っているのは$x variable
、元の の最後の要素を含む$x array
です。この場合、それは になります3
。