あまねこ TOP  >  スポンサー広告 >  php >  PHPで配列を削除する際にヘタにunsetを使うと死ぬ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

PHPで配列を削除する際にヘタにunsetを使うと死ぬ

順番は守りましょうね~

PHPにおけるunsetは元々は指定した変数の割当を解除するというメソッド。
だがコレは配列でも使え、記述が簡単だからホイホイ使うと痛い目にあう。
$ary1 = array("a","b","c","d","e");
unset($ary1[2]);
echo var_dump($ary1);
配列の2番め、つまり"c"は消去される・・・まではいいのだが
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[3]=>
string(1) "d"
[4]=>
string(1) "e"
}
配列に隙間ができているのがわかるだろうか。この現象は連想配列でも同じ。
$ary2 = array(
'key1' => 'data1',
'key2' => 'data2',
'key3' => 'data3',
'key4' => 'data4',
'key5' => 'data5'
);
unset($ary2["key2"]);
echo var_dump($ary2);
結果
array(4) {
["key1"]=>
string(5) "data1"
["key3"]=>
string(5) "data3"
["key4"]=>
string(5) "data4"
["key5"]=>
string(5) "data5"
}
隙間が開くとcountとかfor、foreachで処理しようとした際に問題がでまくる。だからといってarray_valuesメソッドとかarray_mergeでわざわざ隙間を埋めるのも馬鹿らしい。PHPには初めからちゃんと指定した配列を削除するメソッドが用意されているのだから。
$ary1 = array("a","b","c","d","e");
//unset($ary1[2]);
array_splice($ary1, 2, 1);
echo var_dump($ary1);
ちゃんと詰めてくれる
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "d"
[3]=>
string(1) "e"
}
まぁ逆に詰められたくない場合、ただ単に削除のみしてほしい場合はunset、削除して詰めてほしい場合はarray_sliceで使い分けしよう
参考リンク:
PHPのarrayをリストとして使うときはunsetしちゃダメという話 - なんたらノート第三期ベータ
関連記事
[ 2013年08月01日 12:33 ] カテゴリ:php | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。