[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 メーリングリストの案内