- 配列の全要素を加工するとき、わざわざ空配列
$result = []とforeachを書かない array_map(fn($x) => 変換後の値, $array)なら、元の配列を壊さず1行で新しい配列を作れるtrimなど既存の関数1つだけを当てる場合はarray_map(trim(...), $array)とさらに短く書ける
1. 今日のお題とゴール
会員リストの連想配列から画面表示用の「宛名ラベル一覧」と、空白や大文字が混ざったメールアドレスを綺麗に整えた「アドレス一覧」を一括生成するプログラムを作ります。
- 会員配列
$usersから名前様(ID:番号)の文字列配列を作る - メールアドレスの前後空白を消してすべて小文字に統一した配列を作る
- 元の
$users配列の中身は一切書き換えない(安全に別配列として受け取る)
// 期待する出力例
佐藤様(ID:101) / 鈴木様(ID:102) / 高橋様(ID:103)
sato@example.com, suzuki@example.com, takahashi@example.com
PHP, Laravel, Docker
2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード
<?php
$users = [
['id' => 101, 'name' => '佐藤'],
['id' => 102, 'name' => '鈴木'],
];
$labels = []; // 変換のたびに毎回空の配列を用意する必要がある
foreach ($users as $u) {
$labels[] = $u['name'] . '様(ID:' . $u['id'] . ')';
}
毎回空の配列 $labels = [] を用意して foreach で詰め直すとコードが縦に間延びし、「全要素を1対1で変換する」という本来の意図がパッと見で伝わりにくくなります。
<?php
declare(strict_types=1);
$users = [
['id' => 101, 'name' => '佐藤', 'email' => ' SATO@example.com '],
['id' => 102, 'name' => '鈴木', 'email' => 'suzuki@EXAMPLE.com '],
['id' => 103, 'name' => '高橋', 'email' => ' takahashi@example.com'],
];
// 1. アロー関数 fn() で連想配列から「宛名ラベル」の配列を一括生成する
$labels = array_map(
fn(array $u): string => "{$u['name']}様(ID:{$u['id']})",
$users
);
echo implode(' / ', $labels) . PHP_EOL;
// 2. メールアドレスの「前後空白の除去+小文字化」を一括で行う
$cleanEmails = array_map(
fn(array $u): string => strtolower(trim($u['email'])),
$users
);
echo implode(', ', $cleanEmails) . PHP_EOL;
// 3. 既存の関数1つだけを当てるなら trim(...) の省略記法(PHP 8.1+)も使える
$rawTags = [' PHP ', ' Laravel ', 'Docker '];
$trimmedTags = array_map(trim(...), $rawTags);
echo implode(', ', $trimmedTags) . PHP_EOL;
3. ここだけ押さえる!3つのポイント
従来の無名関数 function ($u) { return ...; } と違い、fn($u) => ... は矢印の右側に書いた式の結果が自動で返されます。短くスッキリ書けるため、array_map の相棒として最適です。
array_filter($array, $fn) とは引数の順番が逆で、array_map($fn, $array) は第1引数が関数・第2引数が配列です。順番を取り違えないよう注意しましょう。
PHP 8.1以降の省略記法 trim(...) や intval(...) を使えば、アロー関数すら書かずに既存の関数をそのまま渡せます。文字列連結などの加工が不要なシンプル変換では、この書き方が最も読みやすくなります。
4. 1分ミニチャレンジ
🚀 手を動かしてみよう
正解コードの末尾に $prices = [1000, 2500, 980]; を追加し、array_map(fn(int $p): string => '¥' . number_format($p), $prices) を実行してみましょう。数値の配列が一瞬で「¥1,000」のようなカンマ付き価格表示の配列に変わる快感を体験できます。