PHPの配列はハッシュだけでできているので、ふつーの数値インデックスの配列と違って、要素の削除が面倒だ。unsetで要素を削除すると、歯抜けの配列になってしまう。
<?php //0 =>"foo", 1 =>"bar", 2 =>"hello", 3 =>"world" $array = array("foo", "bar", "hello", "world"); unset($array[1]); ///1番目の要素"bar"を消す var_dump($array); ?>
↓
array (size=3) 0 => string 'foo' (length=3) 2 => string 'hello' (length=5) 3 => string 'world' (length=5)
番号0,2,3の歯抜け配列になってしまった。これをforループすれば、当然エラーになる。私のようなC++のvector, C#のListばっかり使っている人間には直感的にすぐに理解できないが、C#のDictionaryと挙動は同じだ。でも、数値が連続していることが前提でないと、プログラムを組みずらい。
いろいろ調べてみると、array_spliceを使えばいいらしい。
<?php $array = array("foo", "bar", "hello", "world"); array_splice($array, 1, 1);//1番の要素から1つ分、つまり"bar"を消す var_dump($array); ?>
↓
array (size=3) 0 => string 'foo' (length=3) 1 => string 'hello' (length=5) 2 => string 'world' (length=5)
面倒じゃのう。何でもハッシュだと思ってやった方が楽かもしれないね。