PHP入門:高階関数と無名関数の使い方

「関数をもっと柔軟に使いたい」「関数を引数として渡せるの?」
PHP入門を終えた方が次に知っておきたいのが 高階関数(higher-order function) です。この記事では、PHPで関数を引数や戻り値として扱う方法を、無名関数(クロージャ)と組み合わせてわかりやすく解説します。これを理解すれば、コードがもっとシンプルで表現力豊かになります。

高階関数とは何か?

高階関数とは、関数を引数に受け取ったり、関数を戻り値として返す関数のことです。
たとえば「データを加工する処理を受け取り、それを別の関数の中で実行する」イメージです。

PHPで高階関数は使えるのか?

結論:はい、使えます。
PHPでは関数や無名関数を「第一級オブジェクト」として扱えるため、変数に代入したり、引数・戻り値にできます。

無名関数(クロージャ)の基本

無名関数とは名前を持たない関数のことです。
PHPでは function キーワードで定義できます。

$double = function($x) {
    return $x * 2;
};

echo $double(5); // 出力: 10

高階関数の使い方

関数を引数として渡す

function execute($callback, $value) {
    return $callback($value);
}

echo execute('strtoupper', 'hello'); 
// 出力: HELLO

関数を戻り値として返す

function createAdder($n) {
    return function($x) use ($n) {
        return $x + $n;
    };
}

$addFive = createAdder(5);
echo $addFive(10); // 出力: 15

無名関数を組み合わせる

function applyTwice($func, $value) {
    return $func($func($value));
}

$result = applyTwice(function($x) {
    return $x * 2;
}, 3);

echo $result; // 出力: 12

よく使う高階関数の例

PHPの標準関数の中にも高階関数があります。

  • array_map() : 配列の各要素に関数を適用
  • array_filter() : 条件を満たす要素だけ残す
  • usort() : 独自ルールで配列をソート

array_map()のサンプル

$nums = [1, 2, 3, 4];
$result = array_map(function($n) {
    return $n * 2;
}, $nums);

print_r($result); // [2, 4, 6, 8]

array_filter() のサンプル

偶数だけを残す

<?php
$numbers = [1, 2, 3, 4, 5, 6];

$evenNumbers = array_filter($numbers, function($n) {
    return $n % 2 === 0;
});

print_r($evenNumbers);
// 出力: Array ( [1] => 2 [3] => 4 [5] => 6 )

配列のキー(index)は保持されます。連番にしたいときは array_values() を使います。

$evenNumbers = array_values($evenNumbers);
print_r($evenNumbers);
// 出力: Array ( [0] => 2 [1] => 4 [2] => 6 )

usort() のサンプル

usort() は、配列を ユーザー定義の比較関数 を使って並べ替える関数です。

「文字の長さ」順にソート

<?php
$words = ["apple", "kiwi", "banana", "cherry"];

usort($words, function($a, $b) {
    return strlen($a) <=> strlen($b); 
});

print_r($words);
// 出力: Array ( [0] => kiwi [1] => apple [2] => cherry [3] => banana )

ここでは「宇宙船演算子 <=>」を使って、文字数が短い順にソートしています。

配列の連想配列を特定キーでソート

<?php
$users = [
    ["name" => "Taro", "age" => 25],
    ["name" => "Hanako", "age" => 20],
    ["name" => "Ken", "age" => 30]
];

usort($users, function($a, $b) {
    return $a['age'] <=> $b['age']; 
});

print_r($users);
// 出力: 年齢の昇順に並んだ配列

高階関数を使うメリットと注意点

メリット

  • コードが シンプル になる
  • 再利用性 が高まる
  • 処理を 抽象化 できる

注意点

  • 過度に使うと 読みづらくなる
  • クロージャの スコープ(変数の有効範囲) に注意が必要

まとめ

  • 高階関数とは「関数を引数・戻り値にできる関数」
  • PHPでは 無名関数・クロージャ を使って実現可能
  • array_map, array_filter, usort なども高階関数の代表例

高階関数をマスターすれば、コードがより「モダン」で「表現力豊か」に書けます。まずは array_maparray_filter から使ってみましょう!

-PHP
-