何が起きたか
$array = range(1,5);
var_dump($array); // #1
unset($array[0]);
unset($array[1]);
unset($array[2]);
unset($array[3]);
unset($array[4]);
var_dump($array); // #2
// #1
array(5) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
}
// #2
array(0) {
}
ここまでは期待どおりかもしれない。
ここで、空になった配列に要素を追加してみる。念のためreset関数で配列の内部ポインタを先頭にする。
// 先ほどのコードに下記のコードを追記
reset($array);
$array[] = 1;
$array[] = 2;
var_dump($array); // #3
なんと、reset関数で内部ポインタを先頭(=0)に戻したつもりでしたが、実際には、内部ポインタは要素をunsetする前の末尾の4になっていたようです。
(なので新たに要素を追加すると、5から始まる)
// #3
array(2) {
[5]=>
int(1)
[6]=>
int(2)
}
unsetで配列の要素を削除しているライブラリ(e.g. Doctrine ArrayCollection)
Doctrine
のArrayCollection
はunset
を使って配列の要素を削除しています。
public function remove($key)
{
if (isset($this->_elements[$key])) {
$removed = $this->_elements[$key];
unset($this->_elements[$key]);
return $removed;
}
return null;
}
配列から要素を削除して、インデックスを詰める方法
配列から要素を削除して、インデックスを詰める方法は下記のとおりです。
- array_spliceを使う方法
- unsetした後、array_valuesでインデックスを詰める
- unsetした後、array_mergeでインデックスを詰める
詳しくは、下記の参考URLを参照ください。