PHP 5.1.6のforeachではポインタの進み方が違う?
PHPのマニュアルによるとforeachでは「各ループにおいて現在の要素の値が $valueに代入され、内部配列ポインタが一つ前に進められます」ということなんだけど、PHP 5.1.6とPHP 5.2.4ではforeachに入った時点でのポインタが違っているようだ。
[juno@galois] $ cat t.php [~/code]
<?php
$a = array('a', 'b', 'c');
foreach ($a as $e) {
var_dump(current($a));
var_dump(next($a));
echo "----------\n";
}
[juno@galois] $ /usr/local/php/php-5.1.6/bin/php t.php [~/code]
string(1) "a"
string(1) "b"
----------
string(1) "b"
string(1) "c"
----------
string(1) "c"
bool(false)
----------
[juno@galois] $ /usr/local/php/php-5.2.4/bin/php t.php [~/code]
string(1) "b"
string(1) "c"
----------
string(1) "c"
bool(false)
----------
bool(false)
bool(false)
----------
CangeLogも眺めてみたけど、「これだ!」というエントリが見つけられず。なんか気になる。
そもそも正しい挙動はどっちだ?直感的なのは5.1.6のほうだけど、マニュアルと合致しているのは5.2.4かな。

ゆどうふろぐ, 11 月 9th, 2007 at 14:36 [Trackback]
[php]foreachのポインタ…
ちょっとこのエントリを見て(≧◇≦)エーーー!とかおもったので試してみた。 で、どうも参照渡しの際の挙動が大きく変わってるぽい。 最初に内部ポインタがずれるのはその辺の絡み…
komura, 11 月 11th, 2007 at 14:39 [Comment]
少し前に同じことを調べていました。
基本的な関数でこのように挙動が変化するのはどうか
と思いますね。
恐らく、意図した変更ではないように思います。
修正方法を少し考えていたのですが、結構面倒なので
諦めてしまいました。
原因は、以下の修正のようです。
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