MENU

【PHP】無名関数・アロー関数の使い方を解説|Webの基礎

PHPの無名関数・アロー関数の使い方を解説|Webの基礎
目次

はじめに

前回の記事では、function 関数名() { }の形で、名前を付けた関数を作る方法を解説しました。

今回は、名前を付けずにその場で作る関数である無名関数と、それをさらに短く書けるアロー関数を解説します。あわせて、関数を渡して使うarray_filter()・array_map()・usort()で、配列を絞り込んだり、まとめて変換したり、自由な条件で並べ替えたりする方法も紹介します。

今回で、PHP基礎編は最終回です。記事の最後に、全15回の振り返りも載せています。

無名関数とは?

無名関数は、名前を付けずに作る関数です。作った関数は、変数に代入して使います。

<?php
    $greet = function ($name) {
        return "こんにちは、{$name}さん";
    };

    echo $greet("田中"); // こんにちは、田中さん

functionの後ろに関数名を書かず、すぐに($name)と引数を書いています。代入した変数に()を付けて$greet("田中")と書くと、関数として呼び出せます。

無名関数は「変数に値を代入する文」なので、最後の}の後ろにセミコロン(;)が必要です。忘れるとParse errorになります。

「わざわざ変数に入れるなら、普通の関数でよいのでは?」と感じるかもしれません。無名関数が本領を発揮するのは、後で紹介するarray_filter()などに関数を渡すときです。その場でしか使わない小さな処理のために、名前を考えて関数を定義する必要がなくなります。

外の変数を使う(use)

前回の記事で解説したとおり、関数の外の変数は、関数の中からは使えません。これは無名関数でも同じです。

無名関数では、use (変数)と書くと、外の変数を関数の中に取り込めます。

<?php
    $rate = 0.1;

    $withTax = function ($price) use ($rate) {
        return $price * (1 + $rate);
    };

    echo $withTax(100); // 110

use ($rate)がないと、Warning: Undefined variable $rateの警告が出て、正しく計算されません。

useで取り込まれるのは、無名関数を作った時点の値です。作った後に外の$rateを0.08に変えても、関数の中の$rateは0.1のままです。

アロー関数(fn)で短く書く

アロー関数は、無名関数を短く書くための書き方です(PHP 7.4以降で使えます)。先ほどの税込計算をアロー関数で書くと、次のようになります。

<?php
    $rate = 0.1;

    $withTax = fn($price) => $price * (1 + $rate);

    echo $withTax(100); // 110

アロー関数の特徴は次の3つです。

  • functionの代わりにfnと書き、=>の右側に結果になる式を1つだけ書く
  • returnと{ }は書かない(=>の右側の式の結果が、そのまま戻り値になる)
  • 外の変数をuseなしで使える
同じ税込計算を、名前付きの関数・無名関数・アロー関数の3通りで書いたコードを並べて比べた図。アロー関数はfnと=>を使い、return・波括弧・useが不要で1行で書ける
書き方形外の変数
名前付きの関数function 名前($x) { return …; }使えない(引数で渡す)
無名関数function ($x) use ($y) { return …; };useで取り込む
アロー関数fn($x) => 式そのまま使える

アロー関数に書けるのは式1つだけなので、if文を含むような複数行の処理は無名関数で書きます。「1行で書ける短い処理はアロー関数、それ以外は無名関数」と使い分けましょう。

array_filter:条件に合う要素だけを取り出す

array_filter()は、配列の要素を1つずつ関数に渡し、関数がtrueを返した要素だけを残した新しい配列を返します。

<?php
    $scores = [72, 45, 88, 30, 95];

    $passed = array_filter($scores, fn($score) => $score >= 60);

    print_r($passed); // [0] => 72, [2] => 88, [4] => 95

array_filter(配列, 関数)の順番で書きます。60点以上かどうかを判定するアロー関数を渡したので、60点以上の要素だけが残りました。

残った要素のキーは元のままなので、上の例では1と3が抜けています。0から振り直したいときは、配列の要素を追加・削除・検索する関数の記事で紹介したarray_values()と組み合わせます。

<?php
    $scores = [72, 45, 88, 30, 95];

    $passed = array_values(array_filter($scores, fn($score) => $score >= 60));

    print_r($passed); // [0] => 72, [1] => 88, [2] => 95

array_map:すべての要素をまとめて変換する

array_map()は、配列の要素を1つずつ関数に渡し、関数の戻り値を並べた新しい配列を返します。

<?php
    $scores = [72, 45, 88, 30, 95];

    $plus5 = array_map(fn($score) => $score + 5, $scores);

    print_r($plus5); // 77, 50, 93, 35, 100

array_map(関数, 配列)の順番で書きます。array_filter()とは引数の順番が逆になっている点に注意してください。

array_filterとarray_mapの違いを示した図。同じ点数の配列に対して、array_filterは60点以上の要素だけを残し、array_mapはすべての要素に5点を足した新しい配列を作る

usort:自分で決めた順番で並べ替える

配列の並べ替え・文字列変換・集計の関数の記事で紹介したsort()は、値の大小で並べ替える関数でした。「商品の価格の安い順」のように、多次元配列を特定のキーで並べ替えたいときは、並べ方を関数で指定できるusort()を使います。

<?php
    $products = [
        ["name" => "ノート",     "price" => 150],
        ["name" => "消しゴム",   "price" => 80],
        ["name" => "ボールペン", "price" => 120],
    ];

    usort($products, fn($a, $b) => $a["price"] <=> $b["price"]);

    foreach ($products as $product) {
        echo "{$product["name"]}:{$product["price"]}円<br>";
    }
    // 消しゴム:80円 / ボールペン:120円 / ノート:150円

usort()は、要素を2つずつ($aと$b)関数に渡して、どちらを前にするかを判断させます。<=>(宇宙船演算子)は、左が小さければ-1、同じなら0、左が大きければ1を返す演算子で、この結果によって並び順が決まります。

  • 小さい順(昇順)にしたいとき:$a["price"] <=> $b["price"]
  • 大きい順(降順)にしたいとき:$b["price"] <=> $a["price"]($aと$bを入れ替える)

usort()はsort()と同じく、配列そのものを並べ替えるタイプの関数です。

実務サンプル(商品一覧を絞り込み・並べ替え・整形する)

商品データから「在庫がある商品だけ」を取り出し、「価格の安い順」に並べ替え、「表示用の文字列」に変換して一覧表示するサンプルです。array_filter()・usort()・array_map()を順番に使います。

商品データを、array_filterで在庫ありの商品に絞り込み、usortで価格の安い順に並べ替え、array_mapで表示用の文字列に変換する3段階の流れを示した図
<?php
    $products = [
        ["name" => "デスクチェア", "price" => 12800, "stock" => 3],
        ["name" => "モニター",     "price" => 24980, "stock" => 0],
        ["name" => "キーボード",   "price" => 3480,  "stock" => 12],
        ["name" => "マウス",       "price" => 1980,  "stock" => 8],
    ];

    // ① 在庫がある商品だけに絞り込む
    $inStock = array_filter($products, fn($p) => $p["stock"] > 0);

    // ② 価格の安い順に並べ替える
    usort($inStock, fn($a, $b) => $a["price"] <=> $b["price"]);

    // ③ 表示用の文字列に変換する
    $lines = array_map(
        fn($p) => $p["name"] . ":" . number_format($p["price"]) . "円(残り" . $p["stock"] . "点)",
        $inStock
    );
?>
<p>在庫あり(<?php echo count($lines); ?>件)</p>
<ul>
    <?php foreach ($lines as $line): ?>
        <li><?php echo $line; ?></li>
    <?php endforeach; ?>
</ul>

ブラウザには次のように表示されます。

在庫あり(3件)
・マウス:1,980円(残り8点)
・キーボード:3,480円(残り12点)
・デスクチェア:12,800円(残り3点)

ポイントは次のとおりです。

  • 在庫が0の「モニター」は、①のarray_filter()で取り除かれています
  • usort()は並べ替えのときにキーを0から振り直すため、①で抜けたキーをarray_values()で直す必要はありません
  • 各処理がアロー関数1行で書けるため、「絞り込む→並べ替える→変換する」という流れがコードからそのまま読み取れます

よくある質問・エラー対処

Q. アロー関数でsyntax error, unexpected token "{"というエラーが出ます

→ アロー関数では{ }やreturnは使えず、=>の右側に式を1つだけ書きます。複数行の処理を書きたいときは、function ($x) { … };の無名関数を使ってください。


Q. 無名関数の中でUndefined variableの警告が出ます

→ 無名関数の中から外の変数を使うには、function ($x) use ($変数) { … }のようにuseで取り込む必要があります。アロー関数ならuseは不要です。


Q. array_filterの後、for文で取り出すとUndefined array keyの警告が出ます

→ array_filter()は元のキーを残すため、インデックスに抜けができます。array_values()で振り直すか、foreach文で取り出してください。


Q. array_filterとarray_mapで、引数の順番が分からなくなります

→ array_filter(配列, 関数)、array_map(関数, 配列)と逆になっています。迷ったときは、この記事の図で確認してください。

おわりに(まとめ)

まとめ

無名関数・アロー関数を使うと、配列の絞り込みや変換を短く書けます。

  • ✅ 無名関数は名前を付けずに作る関数で、変数に代入して使う(最後に;が必要)
  • ✅ 無名関数で外の変数を使うときは、useで取り込む
  • ✅ アロー関数は fn(引数) => 式 の形で、外の変数をそのまま使える
  • ✅ array_filterは条件に合う要素だけを残す(キーは元のまま)
  • ✅ array_mapはすべての要素を変換した新しい配列を作る
  • ✅ usortと<=>で、多次元配列を好きなキーで並べ替えられる

PHP基礎編を振り返って

今回で、PHP基礎編(全15回)は完結です。PHPの実行環境の準備から始めて、変数・条件分岐・繰り返し・配列・関数と、PHPでプログラムを書くための土台をひととおり解説してきました。

各回の内容は次のとおりです。復習や、忘れたときの確認に使ってください。

  1. 【PHP】PHPとは?基本から解説:PHPの特徴と、サーバーで動く仕組み
  2. 【PHP】実行環境を準備しよう:XAMPPでPHPを動かす準備
  3. 【PHP】基本的な書き方を解説:PHPタグ・セミコロン・コメント
  4. 【PHP】変数の使い方を解説:変数の作り方と文字列への埋め込み
  5. 【PHP】データ型の種類と確認方法を解説:文字列・数値・真偽値・NULLとvar_dump
  6. 【PHP】演算子の種類と使い方を解説:計算・比較・論理の演算子
  7. 【PHP】if文による条件分岐を解説:if・elseif・else
  8. 【PHP】switch文とmatch式の使い方を解説:1つの値による分岐
  9. 【PHP】for文・while文の使い方を解説:回数・条件による繰り返し
  10. 【PHP】配列の基本と使い方を解説:配列・連想配列・多次元配列
  11. 【PHP】foreach文とbreak・continueの使い方を解説:配列の繰り返し処理
  12. 【PHP】配列の要素を追加・削除・検索する関数を解説:array_push・unset・in_arrayなど
  13. 【PHP】配列の並べ替え・文字列変換・集計の関数を解説:sort・implode・array_sumなど
  14. 【PHP】関数の作り方と使い方を解説:引数・戻り値・スコープ
  15. 【PHP】無名関数・アロー関数の使い方を解説(この記事):無名関数・アロー関数・array_filterなど

次回からは、別シリーズとして「WordPress×PHP」をスタートします。WordPressのテーマはPHPで作られていて、この基礎編で学んだループ・配列・関数・無名関数が、そのままカスタマイズに活かせます。当サイトでも使っているテーマ「SWELL」の子テーマを例に、functions.phpの書き方やフックの使い方などを解説していく予定です。

また、Webフォームから送られた値の受け取り方など、PHPの基礎編で扱いきれなかったテーマについても、必要に応じて記事を追加していく予定です。

この記事が、少しでも誰かのお役に立てれば幸いです。

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次