例
$arr = array(0, 1, 2, 3, 4, 5);
$arr = array_filter($arr, function($var) {
return $var % 2 === 0;
});
var_dump($arr);
配列に 0 ~ 5 までの数字を入れて、奇数のみを array_filter を通してフィルタリングしています。
結果が次のようになります。
array(3) {
[0]=>
int(0)
[2]=>
int(2)
[4]=>
int(4)
}
何が問題か
インデックスと cout($arr) した際の値が異なることになるので、for でループを回すとエラーが発生する。
for ($i = 0, $l = count($arr); $i < $l; $i++) {
echo $arr[$i];
}
結果が以下
Notice (8): Undefined offset: 1 [test.php, line 4]
解決方法
array_values() でインデックスを振り直す
※ コメントにてご指摘いただきましたので追記します。
渡した配列に数字添字を付けた配列を返すようです。
$arr = array_values($arr);
array_merge() でインデックスを振り直す
※ こちらは利用せずに上記の array_values() を利用した方がいいようです
array_merge() に渡すとインデックスを振り直した配列を返します。
$arr = array_merge($arr);
foreach を使用する
この場合はインデックスを考える必要がなくなります。
foreach ($arr as $val) {
echo $val;
}
感想
array_filter() がインデックスを振り直さないメリットが思い浮かびません。