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

sumi @ orihime.net sumi @ orihime.net
2003年 6月 4日 (水) 12:05:16 JST


SUMiです。おはようございます。

大垣さん、うめばやしさん、ありがとうございます。

大垣さんの書かれた
> 気にしたことが無い(PHPの配列はLinked List順序付きのハッシュ)なので
> この動作に疑問をもったことがありませんでした。

という「PHPの配列はLinked List順序付きのハッシュ」であることは理解してい
ます。ですから、実際に現在の挙動になることも理解しています。

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

となっているので、

array(2) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
}

この配列に対して

$array[] = 'D';

という動作を行った場合に

array(3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
}

という結果になるのは、(それまでにこの配列に対してどういう操作を行ったか
に関わらず)(マニュアルに照らし合わせると)おかしいのではないか、という
ことを言いたいのです。

マニュアルの

> キーを省略した場合、整数添字の最大値が使用され、新しいキーはそ の最大
> 値+1となります。

この部分が、あえてくどい書き方ですが

> キーを省略した場合、「その配列に使用されている、もしくは使用されていた」
> 整数添字の最大値が使用され、新しいキーはそ の最大値+1となります。

となっており、「現在の整数添字の最大値+1のキーが保証されるわけではない」
という意味を含めていれば問題ないと思います。

うめばやしさんの書かれた
>  全然バグなどではありませんです。

ということはもっともなのですが、これが「仕様」であるならば、誤解を招くマ
ニュアルの記述はいかがなものかと。

# なんつーか、重箱の隅をつついたような話になってしまいましたが、粘着とか
# 言わんで下さいね ^^;


あと、配列に絡んでもう一件ですが、マニュアルの同じページに

> 整数値は負の数となる可能性があるため、 負の添字も有りえます。例えば、
> 最高時の添字が-6 の場合、次のキーは-5となります。 

という記述と

> array( [key =>] value
>      , ...
>      )
> // key は string または非負の 整数のどちらか
> // value は何でも可

という記述があります。

実際に

$array = Array( -6 => 'A', 'B' );

もしくは

$array[-6] = 'A';
$array[] = 'B';

とすればいずれも

array(3) {
  [-6]=>
  string(1) "A"
  [0]=>
  string(1) "B"
  [1]=>
  string(1) "C"
}

となりますので、-6はstringとして扱われているようなので負の整数の添字が作
成できません。配列関数を確認したのですが、負の整数の添字を作れそうな関数
もありませんでした。どのような場面で負の整数の添字が出てくるのでしょうか?




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