[PHP-users 15631]Re: unset()の挙動
KOYAMA Tetsuji
koyama @ hoge.org
2003年 6月 2日 (月) 22:44:06 JST
小山です。
At Mon, 02 Jun 2003 20:44:56 +0900,
SUMi wrote:
> unsetで最大値が変わらない=歯抜けの部分に新規追加されるわけではないとい
> うことも、理解していました。
> ただ、今回の場合は「歯抜け」ではなく「最終要素の削除」なので、キーを省略
> して新しく要素を追加した場合は、最大値+1になるはずでは?と疑問に思ってい
> ます。
私も件のメールを書いた後で、 SUMi さんの
<20030602181843.653A.SUMI @ orihime.net> の例を見て、確かに感覚的におか
しいなと思いました。
> unsetが「要素を削除」するのではなく、「undefinedな値にする」というのなら
> 納得もいくのですが、そうでもないですし。
>
> 「これがPHPのarrayの扱いの仕様なんじゃ!」と言われればそれまでなんですが、
> 仕様にしてもどうも釈然としません。
おそらく、配列内部にこれまでの最大整数値を持ってる実装なんじゃないか
と考えてソースを追いかけてみたのですが、よくわかりませんでした。(笑)
ドキュメントの
http://www.php.net/manual/ja/language.types.array.php
| キーを省略した場合、整数添字の最大値が使用され、新しいキーはその最
| 大値+1となります。
を仕様とするならば、この挙動はあきらかにおかしいのでバグと呼んでもよい
と思います。しかし、では正しく実装しようとすると、結局配列内の全要素を
舐めなければいけないので、それもなんだかなぁという感じです。
とりあえずユーザ側で全舐めしてキーの最大整数値を求めるのは簡単なので、
どうしてもその必要があれば、私ならそうしますかねぇ。
function greater_index(&$array)
{
if (!is_array($array)) {
return null;
}
$max = 0;
foreach ($array as $key => $val) {
if (is_int($key) && ($key > $max)) {
$max = $key;
}
}
return $max;
}
こんな感じ。
--
小山 哲志@ビート・クラフト
koyama @ beatcraft.com
koyama @ hoge.org
PHP-users メーリングリストの案内