1

次の方法で foreach を使用していることに気付いた同僚がいます。

foreach ($var as $var) {
    // do stuff here
}

上記のコードをテストしたところ、驚いたことに正しく動作しました。PHP の達人は飛び込んで、なぜこれが間違っているのか教えてくれませんか? それは非常に間違っていると感じます。

4

5 に答える 5

4

の値が変わるからです$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 が指摘したように、$varnot$var自体のコピーを反復処理します。したがって、反復ごとに値$varが変化しますが、作成されたコピーをループしているため、ループは中断されません。

于 2013-04-30T14:33:05.617 に答える
0

$varあなたの同僚は、ループ後の配列としてはもう必要ないようです。$varPHP が 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);
于 2013-04-30T14:39:44.897 に答える
0

foreach間違っているように感じても、開始した瞬間に PHP が内部的にデータにアクセスしているため、それでも機能します。

したがって$var、上書きされても、このデータはメモリ内にまだ存在し (元の配列)、$var反復ごとに現在の値に設定されます。

あなたが見つけた、あなたが間違っていると言う具体的な問題は、変数の再利用としても知られており、これはコードの匂いであるため、防止する必要があります。

気分が悪いだけでなく、そのようなコードを書くのは間違っています。より良いコードを一緒に書けるように、同僚に伝えてください。

于 2013-04-30T14:33:37.380 に答える
0

ループだから。実行:

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 
 */
}
于 2013-04-30T14:34:19.777 に答える
0

次の式を確認してください。

$x = array(1,2,3);
foreach ($x as $x) {
    echo $x; //prints 123
}

ここで起こっていることは、foreachが配列の最初の要素を抽出し、それ自体$xにオーバーライドする$xことです。ただし、キーワード$xの左側にあった配列変数は、引数の内部スコープに残っているため、ループは問題なく機能します。asforeach

ループが完了する$xと、(配列)の内部にあったforeachはスコープを失い、存在しなくなります。残っているのは$x variable、元の の最後の要素を含む$x arrayです。この場合、それは になります3

于 2013-04-30T14:36:37.033 に答える