[PHP-dev 771]$array[]とunset()の挙動について

sumi @ orihime.net sumi @ orihime.net
2003年 6月 3日 (火) 15:30:05 JST


SUMiです。

[PHP-users 15619]からの一連のスレッドで話題になった(というか私が投げた
のですが。)のですが、$array[]とunset()を使用した場合にどうしてもマニュ
アルとスクリプトの挙動に差異が認められますので、こちらにも投げます。

状況を確認した環境は
WinXP Pro上で、PHP4.3.1CGI版をコマンドラインから起動
です。

スクリプト
-----------------------------------------------
$array = Array( 'A', 'B', 'C' );
var_dump( $array );
unset( $array[sizeof($array)-1] );
var_dump( $array );
$array[] = 'D';
var_dump( $array );
-----------------------------------------------

出力結果
-----------------------------------------------
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}
array(2) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
}
array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>            <-- 2になるべきでは?
  string(1) "D"
}
-----------------------------------------------

http://jp.php.net/manual/ja/language.types.array.php
> キーを省略した場合、整数添字の最大値が使用され、新しいキーはそ の最大
> 値+1となります。整数値は負の数となる可能性があるため、 負の添字も有り
> えます。例えば、最高時の添字が-6 の場合、次のキーは-5となります。 整数
> 添字がまだ存在しない場合、キーは0(ゼロ)となります。 値が既に代入されて
> いるキーを指定した場合、元の値は上書きされます。 

マニュアルにはこうありますので、上記スクリプトのunset後の要素追加の挙動
はおかしいのではないでしょうか?

ソースを確認していませんが、[PHP-users 15631]で小山さんも書かれているよ
うに、内部的には配列の整数添字の最大値を別に確保し、キーを省略された場合
にはその最大値+1の添字で要素をを追加する、という動作をしているのでしょう
が、unsetで要素を削除された場合には最大値の変更を確認していないような動
作です。

array_popとarray_pushを使用して、上記スクリプトと同様の動作をするスクリ
プトを作成できるので、スクリプトの作成自体には困らないのですが、言語仕様
(マニュアル)と挙動の差異は気持ち悪いのでポストさせていただきました。



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