piyokokkox’s blog

技術、グルメ、輸入菓子、料理、日常、ゲームなど...書きたいことを書き殴る

【PHP】array_filterの思わぬ"罠"について...

こんばんは🌙piyokokkoxです🐥

今回はやっと技術系の記事です!!💻

突然ですが、PHP「array_filter」をご存知でしょうか?

PHPで配列の要素を取り除く関数で、とても便利なものになります!!

<?php
array_filter(任意の配列, コールバック関数, 引数として何をコールバックに入れるのかを指定する(省略可))

一見ただの便利関数と思われるのです...が...が隠れているんですよね。

それは、この関数の返り値を見ていただくとわかります。以下は例です。

<?php
$array = [1, 2, 3, 4];
echo var_dump(array_filter($array, fn ($val) => $val > 2));
?>

こんな感じで、配列をarray_filterに渡します。この処理では2以下のものが排除された配列が返るはずです。それでは、結果を見てみます!

array(2) {
  [2]=>
  int(3)
  [3]=>
  int(4)
}

要素は3,4のみになっていて、フィルタリングはできているのですが...

インデックスが2,3...?

そこは0,1でしょう!と言いたいところですが、これがこいつの仕様みたいですね😢

私はバックエンドをPHP(Laravel),フロントをVue,TypeScriptで開発を行うことが多いので、このデータをそのままフロントのTypeScript側のArray型で定義されている変数に送ったところ、

「Arrayで定義されていますが、渡されたのはObjectですよ!」

みたいなエラーが返され、配列で渡しているはずなのに...と、最初は全く意味がわからなかったのですが、どうやらインデックスが連番になっていなかったのが原因だったみたいです💦

私と同じようにVue,TypeScriptと連携して開発を行なっている方は要注意です!

この歯抜けインデックスの対処法としては、下記のように「array_values」に先ほどの配列を渡してあげます🦷

<?php
$array = [1, 2, 3, 4];
echo var_dump(array_values(array_filter($array, fn ($val) => $val > 2)));
?>

結果は、

array(2) {
  [0]=>
  int(3)
  [1]=>
  int(4)
}

連番になりました!!なんか非効率な感じもしますが、これが一番手っ取り早い気がします!

今日はPHPの配列操作系関数のarray_filterの注意点について紹介しました!

ここまで読んでいただきありがとうございます!