💡 今日の3行まとめ
  • 配列の全要素を加工するとき、わざわざ空配列 $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 ⭕ コピペで動く正解コード

❌ やりがちなNGコードBefore
<?php
$users = [
    ['id' => 101, 'name' => '佐藤'],
    ['id' => 102, 'name' => '鈴木'],
];
$labels = []; // 変換のたびに毎回空の配列を用意する必要がある
foreach ($users as $u) {
    $labels[] = $u['name'] . '様(ID:' . $u['id'] . ')';
}

毎回空の配列 $labels = [] を用意して foreach で詰め直すとコードが縦に間延びし、「全要素を1対1で変換する」という本来の意図がパッと見で伝わりにくくなります。

⭕ コピペで動く正解コード(PHP 8.3+)After
<?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つのポイント

1アロー関数「fn($x) => 式」でreturnを省略できる

従来の無名関数 function ($u) { return ...; } と違い、fn($u) => ... は矢印の右側に書いた式の結果が自動で返されます。短くスッキリ書けるため、array_map の相棒として最適です。

2引数の順番は「コールバック関数が先、配列が後」

array_filter($array, $fn) とは引数の順番が逆で、array_map($fn, $array) は第1引数が関数・第2引数が配列です。順番を取り違えないよう注意しましょう。

3単一関数の適用は「関数名(...)」でさらにスッキリ

PHP 8.1以降の省略記法 trim(...) や intval(...) を使えば、アロー関数すら書かずに既存の関数をそのまま渡せます。文字列連結などの加工が不要なシンプル変換では、この書き方が最も読みやすくなります。

4. 1分ミニチャレンジ

🚀 手を動かしてみよう

正解コードの末尾に $prices = [1000, 2500, 980]; を追加し、array_map(fn(int $p): string => '¥' . number_format($p), $prices) を実行してみましょう。数値の配列が一瞬で「¥1,000」のようなカンマ付き価格表示の配列に変わる快感を体験できます。