はじめに
前回の記事では、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); // 110use ($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なしで使える

| 書き方 | 形 | 外の変数 |
|---|---|---|
| 名前付きの関数 | 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] => 95array_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] => 95array_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, 100array_map(関数, 配列)の順番で書きます。array_filter()とは引数の順番が逆になっている点に注意してください。

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()を順番に使います。

<?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でプログラムを書くための土台をひととおり解説してきました。
各回の内容は次のとおりです。復習や、忘れたときの確認に使ってください。
- 【PHP】PHPとは?基本から解説:PHPの特徴と、サーバーで動く仕組み
- 【PHP】実行環境を準備しよう:XAMPPでPHPを動かす準備
- 【PHP】基本的な書き方を解説:PHPタグ・セミコロン・コメント
- 【PHP】変数の使い方を解説:変数の作り方と文字列への埋め込み
- 【PHP】データ型の種類と確認方法を解説:文字列・数値・真偽値・NULLとvar_dump
- 【PHP】演算子の種類と使い方を解説:計算・比較・論理の演算子
- 【PHP】if文による条件分岐を解説:if・elseif・else
- 【PHP】switch文とmatch式の使い方を解説:1つの値による分岐
- 【PHP】for文・while文の使い方を解説:回数・条件による繰り返し
- 【PHP】配列の基本と使い方を解説:配列・連想配列・多次元配列
- 【PHP】foreach文とbreak・continueの使い方を解説:配列の繰り返し処理
- 【PHP】配列の要素を追加・削除・検索する関数を解説:array_push・unset・in_arrayなど
- 【PHP】配列の並べ替え・文字列変換・集計の関数を解説:sort・implode・array_sumなど
- 【PHP】関数の作り方と使い方を解説:引数・戻り値・スコープ
- 【PHP】無名関数・アロー関数の使い方を解説(この記事):無名関数・アロー関数・array_filterなど
次回からは、別シリーズとして「WordPress×PHP」をスタートします。WordPressのテーマはPHPで作られていて、この基礎編で学んだループ・配列・関数・無名関数が、そのままカスタマイズに活かせます。当サイトでも使っているテーマ「SWELL」の子テーマを例に、functions.phpの書き方やフックの使い方などを解説していく予定です。
また、Webフォームから送られた値の受け取り方など、PHPの基礎編で扱いきれなかったテーマについても、必要に応じて記事を追加していく予定です。
この記事が、少しでも誰かのお役に立てれば幸いです。
関連記事
当サイトの記事で使用したVBAなどのサンプルをDLできます
この記事のサンプルはありません!
ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!

