配列からnullの要素を削除する

 array_filterを使う。
$arr = array_filter($arr);
 第二引数にはコールバック関数を指定する。上記のように省略した場合は、結果がfalseになる要素はすべて削除されるため、結果的にnullも削除される。
 空文字列や数字のゼロなど、falseと見なされる有効な要素がある場合は、ちゃんとコールバック関数を指定してnullを識別するようにすれば良さそう。
 こんなふうにarray_diffを使っても良さそうだけど(未検証)。
$arr = array_diff($arr, array(null));
 配列要素でループして、自前で判定→削除という方法もあるけど、PHPの配列は実はすべて連想配列らしく、途中の要素を削除しても、後続の要素は前に詰められない。なので要素削除時、大抵の言語では最大の添え字→ゼロの逆順で削除するのがセオリーだろうけど、PHPに限ってはゼロ→最大の添え字の順で削除してっても大丈夫。
 逆に言うとPHPでは、途中の配列要素を削除すると、その要素を指し示す添え字(要は連想配列のキー)がなくなるので要注意。
$array = array('abc', null, 'def');
foreach ($array as $key=>$val) {
 if ($val===null) unset($array[$key]);
}
 上記の例だと$array[1]が削除されるから、実行後は$array[0]と$array[2]しか存在しなくなる……。

 ついでに、連想配列ってことは数字の添え字もいわゆるインデックスではないわけで、他の言語と同じように考えてると痛い目に合うかも。
$arr = array();
$arr[1] = 'def';
$arr[0] = 'abc';
$arr[2] = 'ghi';
foreach($arr as $ind=>$str) {
	echo $ind, '=>', $str, "\n";
}
 上記コードの実行結果は以下の通り。
1=>def
0=>abc
2=>ghi
 添え字0→1→2とアクセスしているつもりでも、実際にはそうならない(連想配列なのに、追加された順序がずっと保持されてるってのも不思議だけど)。

2010/09/22 21:44:15
最終更新:2010年09月22日 21:44