foreach内では内部配列ポインタを触るな

先日のエントリ、PHP 5.1.6のforeachではポインタの進み方が違う?に関してkomuraさんより以下のようなコメントを頂き、

少し前に同じことを調べていました。
基本的な関数でこのように挙動が変化するのはどうか
と思いますね。

恐らく、意図した変更ではないように思います。
修正方法を少し考えていたのですが、結構面倒なので
諦めてしまいました。

原因は、以下の修正のようです。

Fixed bug #37715 (array pointers resetting on copy). (Dmitry)
http://bugs.php.net/bug.php?id=37715

ソースコードでは、以下の変更が行われています。
以下の変更を戻すと、PHP 5.2.3 以前と同じ挙動になります。
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.c?r1=1.150&r2=1.151

あらためてbugs.php.netを探したところ、PHP Bugs: #42690 key function in foreach array does not start from the beginning of arrayというバグレポートが見つかりました。報告されている状況は、まさにforeach中での内部配列ポインタの件なんですが、これに付けられたコメントによると「foreach中でのkey()/next()/prev()といった関数は未サポートなので、これはバグではありません」という結論のようです。

確かに、foreach中で内部配列ポインタを意識するコードなんて普通書かないし、今回も他の人がハマっているのを見て気付いたのですが、マニュアルに言及あったかなあ…。

使用可能なタグ <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>