アプリ版:「スタンプのみでお礼する」機能のリリースについて

https://oshiete.goo.ne.jp/qa/9714215.html
で質問したのですが、疑問点を絞りましたので質問し直します。
例えば次の場合、
「echo "<br>";」よりも上の方が正しくて下は問題があることは分かります。
内側のforeachの前では外側のforeachの$keyになりますが、
内側のforeachの後では内側のforeachの$keyになってしまいます。
結果の0-A abc の後が0-Aではなく2-Cになってしまった所です。
ここまでは当然だと理解できるのですが、
内側のforeachの前に戻った時に外側のforeachの$keyに戻る仕組みが分かりません。
結果の2-Cの後が3-Dではなく1-Bに戻っている所です。
この理由について、どなたか、分かりやすく解説していただけないでしょうか。
よろしくお願いします。

<?php
$name = array("A","B","C","D");
$list = array("a","b","c");
foreach ($name as $key1 => $val1) {
echo $key1."-".$name[$key1]."<br>";
foreach ($list as $key2 => $val2) {
echo $list[$key2];
}
echo "<br>".$key1."-".$name[$key1]."<br>";
}
echo "<br>";
foreach ($name as $key => $val) {
echo $key."-".$name[$key]."<br>";
foreach ($list as $key => $val) {
echo $list[$key];
}
echo "<br>".$key."-".$name[$key]."<br>";
}
exit;
?>
結果:
0-A
abc
0-A
1-B
abc
1-B
2-C
abc
2-C
3-D
abc
3-D

0-A
abc
2-C
1-B
abc
2-C
2-C
abc
2-C
3-D
abc
2-C

A 回答 (1件)

> 結果の2-Cの後が3-Dではなく1-Bに戻っている



foreachで配列を走査するのにキーは使われていません。
配列は内部ポインタというものをもっていて、現時点のカレント位置を保持します
foreachによって次のポインタに移ったときに再度$keyが読み直されます

一方、forで回す場合は$iなど配列とは直接関係ないカウンタを使うため、
$iが上書きされてしまうと挙動がおかしくなります
    • good
    • 0
この回答へのお礼

yambejpさん、引き続き回答していただき、ありがとうございました。
「内部ポインタ」という言葉を理解せずに使っていました。
改めて検索して調べてみました。
おかげ様で疑問点が解消しました。
私のプログラムが問題なく動作していたことが疑問だったのですが、
ようやく納得しました。
ありがとうございました。

お礼日時:2017/04/14 15:20

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