#21 PHPで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本

配列を「ループ」ではなく「操作」で考える

PHPでプログラムを書いていると、配列(複数の値をまとめて入れておく箱のようなデータ構造)を扱う場面がよく出てきます。その中から条件に合うものだけを取り出したり、全部の値を加工したりすることも多いはずです。こうした「集まったデータ(コレクション)に対してまとめて処理を行うこと」を、一般に「コレクション操作」と呼びます。

初心者のうちは foreach ループで1つずつ処理を書きがちです。しかしPHPには「フィルタ(絞り込み)」や「マップ(変換)」といった考え方に対応した便利な関数が標準で用意されています。今回はその代表格である array_filter・array_map・array_reduce を使って、コードを短く読みやすくする方法を紹介します。

array_filterで条件に合う要素だけ残す

「フィルタ」とは、配列の中から条件を満たす要素だけを選び出す操作です。PHPでは array_filter 関数を使います。

$numbers = [1, 2, 3, 4, 5, 6];
$evens = array_filter($numbers, function ($n) {
    return $n % 2 === 0;
});
print_r($evens); // [1 => 2, 3 => 4, 5 => 6]

ここで注意したいのが、array_filter は元の配列の「キー(添字番号)」をそのまま保持するという点です。上の例では偶数だけが残りますが、添字は0から連番になり直さず、元の位置(1, 3, 5番目)のままになります。連番に振り直したい場合は array_values($evens) を組み合わせましょう。この挙動は他の言語の filter と比べてPHPらしい癖なので、覚えておくとハマりにくくなります。

array_mapで要素をまとめて変換する

「マップ」は、配列の各要素に同じ処理を適用して、新しい配列を作る操作です。値を2倍にしたり、文字列を大文字にしたりする場合に便利です。

$prices = [100, 200, 300];
$taxed = array_map(function ($p) {
    return (int)($p * 1.1);
}, $prices);

array_map は第1引数にコールバック関数、第2引数に対象の配列(この例では $prices)を渡します。第2引数を渡し忘れるとエラーになるので注意してください。

PHP 7.4以降で使えるアロー関数(fn)を使うと、もっと簡潔に書けます。

$taxed = array_map(fn($p) => (int)($p * 1.1), $prices);

アロー関数は function() use ($変数) のような外部変数の受け渡し(クロージャのuse句)を省略できるのが利点です。外側のスコープの変数を自動的に読み取ってくれます。

array_reduceで1つの値に集計する

フィルタ・マップと並んでよく使うのが、配列全体を1つの値にまとめる「リデュース(畳み込み)」です。合計金額の計算などに使います。

$total = array_reduce($taxed, function ($carry, $item) {
    return $carry + $item;
}, 0);

第3引数の 0 は初期値です。これを省略すると最初の要素がそのまま使われてしまい、意図しない結果になることがあるので、数値の合計を出す場合は必ず初期値を指定する習慣をつけましょう。

組み合わせて使うときのコツ

実務では「フィルタしてからマップする」といった組み合わせもよく行います。関数を入れ子にすると読みにくくなるため、途中結果を変数に代入しながら段階的に処理すると、後から見返したときに何をしているか分かりやすくなります。処理の意図が伝わるコードは、チーム開発だけでなく数か月後の自分にとっても親切です。

まとめ

PHPの array_filter・array_map・array_reduce を使うと、ループ処理を関数ベースの短いコードに置き換えられます。特に array_filter がキーを保持する点、array_map の引数の順番、array_reduce の初期値の3つは、初心者がつまずきやすいポイントです。まずはこの記事のサンプルコードを実際に動かして、挙動を確かめてみてください。慣れてくると、コードの見通しがぐっと良くなるはずです。

関連記事


本ページはプロモーションを含みます。

参考書籍(PR)

PHPをもっと学びたい方には「10日でおぼえるPHP入門教室 第4版」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本