[PHP-dev 1156] foreachの挙動に関しまして
又村 深
matamura @ m-flats.co.jp
2005年 7月 13日 (水) 22:15:01 JST
又村と申します。
いつもPHPにはお世話になっており、開発コミュニティの方々には
大変感謝しております。
さて、PHPのforeach文の挙動に関しましてご報告がございます。
以下のようなコードを実行すると、配列の値が壊れるようです。
##以下サンプルソース
<?php
$arr = array("1","123","12345");
print "before\n";
print_r( $arr );
foreach ( $arr as $val => $val ) {
echo "debug {$val}\n";
}
print "after\n";
print_r( $arr );
?>
##サンプルソース以上
【実行結果】
php destroy_array.php
X-Powered-By: PHP/4.2.4-dev
Content-type: text/html
before
Array
(
[0] => 1
[1] => 123
[2] => 12345
)
debug 0
debug 1
debug 2
after
Array
(
[0] => d
[1] => deb
[2] => debug
)
いくつか条件を変えて試しましたが、以下の条件で
echo文で出力した内容で配列が上書きされるようです。
・foreach文で配列をループする際、キーと値に同じ変数を指定する
・ループさせる配列の要素が文字列である
・ループで使用した変数を”の中で使用する(ループの外でもOK)
上記添付した実行結果はWindowsバイナリ(4.2.4-dev)ですが、
以下のconfigureオプションでRedhatLinux上でソースコンパイルした
PHP4.3.11でも再現致しました。
--prefix=/usr/local
--enable-mbstring
--enable-mbregex
--with-pgsql=/usr/local/pgsql
--with-mysql=/usr/local/mysql
--with-apxs2=/usr/bin/apxs
--with-session-pgsql
--with-config-file-path=/etc/httpd
3.x系と5.x系は環境が無い為にテスト出来ておりません。
「キーと値に同じ変数を指定する」と言う普通ではない使用法での現象ですので、
特に修正を希望するわけではございませんが、代入していないメモリ上のデータが
変数に入って来てしまっている点で、何かメモリ系で想定外の挙動を起こしている可能性が
あると思い、ご報告差し上げました。
既知の現象でしたら大変申し訳ございませんが、お読み飛ばし下さいませ。
以上、失礼致します。
-------------------------
株式会社 メディアフラッツ
テクニカルグループ 又村 深
〒254-0042
神奈川県平塚市明石町1-24 太陽生命平塚ビル7F
TEL:0463-25-6812 FAX:0463-25-6813
URL:www.m-flats.co.jp
E-MAIL:matamura @ m-flats.co.jp
PHP-dev メーリングリストの案内