[PHP] あれっ? array_filter使うとインデックスに空き番ができる?

2022年8月27日土曜日

PHP

t f B! P L

enter image description here

array_filter で取得した配列のインデックス

PHPの array_filter 関数は、条件に一致する要素を配列の中から抽出するフィルター関数である。

この array_filter 関数を、インデックスが数値の配列に対して実行すると、戻り値の配列は、フィルターで除外された要素のインデックスが空き番になった状態の配列が返ってくる。

実際に実験してみよう。。。

次のサンプルコードは、数値の配列から array_filter 関数を使って偶数の要素を取り出す例である。

$array = [ 1, 2, 3, 4, 5, 6, 7 ];
$filter = array_filter($array, fn($value) => $value % 2 == 0);  //偶数要素のみフィルタ
dump($filter);

実行結果を見てみよう。確かに奇数の要素のインデックスが空き番になっていますね。。。

^ array:3 [
  1 => 2
  3 => 4
  5 => 6
]

インデックスを綺麗にする

上述のように、array_filter 関数で取得した配列のインデックスは、除外された要素のインデックスが空き番になる仕様なので、インデックスを綺麗に連番にしたい場合は、array_values などを使って、もう一度配列を作成する。

$array = [ 1, 2, 3, 4, 5, 6, 7 ];
$filter = array_filter($array, fn($value) => $value % 2 == 0);  //偶数要素のみフィルタ

$new_array = array_values($filter);  //インデックスの振り直し
dump($new_array);

実行結果は次のとおり。 array_values によって、配列のインデックスが連番に振り直されているのが分かる。

^ array:3 [
  0 => 2
  1 => 4
  2 => 6
]

スプレッド演算子でもOK

ちょっとモダンに書きたいのなら、スプレッド演算子を使ってもいいだろう。

$array = [ 1, 2, 3, 4, 5, 6, 7 ];
$filter = [...array_filter($array, fn($value) => $value % 2 == 0)];  //偶数要素のみフィルタ
dump($filter);

■ 実行結果

^ array:3 [
  0 => 2
  1 => 4
  2 => 6
]

まとめ

array_filter でズレた配列のインデックスを振り直す方法を紹介した。

これ知らないと、思わぬバグを生む仕様だし、この仕様って正直どうなんだろう。。。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ