[PHP-users 20470]Re: PHP3とPHP4の違いについて

Seto seto @ cii.gr.jp
2004年 2月 19日 (木) 21:34:31 JST


 Setoです。
ちょうどPHP3の環境を作ったところなのでテストしてみました

記載されたスクリプトに1行追加してテストしてみたところ

>for( $i=0; $i < count($testarry); $i++ ) {
>   echo $testarry[$i]["AAA"];
>   echo $i."<br>";
>} 
>
>echo "<br>COUNT".count($testarry)."<br>";
>
>unset($testarry[1]);
>
>echo "<br>COUNT".count($testarry)."<br>";
>
>reset($testarry);
>
>for( $i=0; $i < count($testarry); $i++ ) {

echo count( $testarry );

>   echo $testarry[$i]["AAA"];
>   echo $i."<br>";
>} 

これをPHP4で実行すれば 普通に

h0
i1
j2
k3
l4

COUNT5

COUNT4
4h0
41       // 実際はここでNotice: Undefined offset: 1 が出てます
4j2
4k3


でPHP3だと

h0
i1
j2
k3
l4

COUNT5

COUNT4
4h0
41
5j2   // ここでcountの結果が変わってます。
5k3
5l4

つまりPHP3の場合(問題はunsetではなく)
$i = 1 のときに
    echo $testarry[$i]["AAA"];
を実行した時点で 配列に要素の追加が行われているらしい
ことが問題のようですね。
この動作についてマニュアルに何か記載があるかどうかは
見つけられてませんが、ちょっと意外でした。

PHP3のときは私はforの中で毎回count()と比較しないで
forの前に $n = count(xx); しておいてforの中では$nと比較する
ようにしていました。それかeachを使うか。
とりあえず それならPHP3とPHP4で同じ動作になると思います。
新規でPHP4ならforeachですかね。
ソースの2重管理をするか、PHP3に戻すことを考えないなら
foreachに書き換えた方がPHP4らしくなるのでは。

回答ではないですが参考まで。



PHP-users メーリングリストの案内