21
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP の array_filter を通すとインデックスに差が生まれる

Last updated at Posted at 2014-10-24

$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() がインデックスを振り直さないメリットが思い浮かびません。

21
15
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?