dポイントプレゼントキャンペーン実施中!

配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、なぜダメなのでしょうか?

$arr = array("値1", "キー1" => "値2", "値3");

foreach($arr as $key => $val){
$arr[$key] = "-{$val}-";
echo $val."<br />";
}

foreach($arr as $key => $val){
echo "<br />".$val;
}

上のforeachの結果が、下と同じようになると期待したのですが、うまくいきません。
なんで、上のforeachと下のforeachの結果が異なるのでしょうか?

foreach文で要素の値が更新されるのは、foreach文が終了した瞬間なのでしょうか。
それとも、値はすぐに更新されているけれども、foreach文の処理(順番に抽出する作業?)は既にスタートしてしまっているので、ループ中に更新されても、途中で反映することはできない、ということなのでしょうか?

さっぱり分からないので、誰か教えてください。

「配列の要素の値をループ中に変更して確認したい」というよりは、
「なんで、二つのforeach文で結果が異なるか知りたい」です。

A 回答 (1件)

上のforeachでは、$arr[$key]の内容を$valにコピー(値渡し)しているに過ぎないからです。


C言語でいうポインタ(参照渡し)ではありません。

上のforeachでは、下記のような流れになります。

1)$arr[$key]の内容を$valにコピー。
2)$arr[$key]の内容を"-{$val}-"に書き換え。
3)$valを表示。
4)$keyをインクリメントして1)へ戻る

よって、上のforeachでは書き換え前の値が表示されます。
下のforeachでは、書き換えられた後の配列を表示しているため、2)でセットした値が表示されるはずです。
    • good
    • 0
この回答へのお礼

よく分かりました。ありがとうございます!

お礼日時:2010/06/04 08:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!