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