【PHP8.x】max関数の使い方

作成日: 更新日:

max関数は、与えられた複数の値、または配列内の要素の中から、最も大きい値を見つけ出し、その値を返す関数です。この関数は、数値の比較だけでなく、文字列や他の型の値に対しても適用できますが、PHPの型比較ルールに基づいて比較が行われます。

引数には二つの渡し方があります。一つは、カンマで区切って複数の値を直接渡す方法です。例えば、max(10, 20, 5)と指定すると、これらの数値の中から最大の20が返されます。もう一つは、一つの配列を引数として渡す方法です。例えば、max([10, 20, 5])と指定すると、配列内の10205の中から最大の20が返されます。

数値以外の値を比較する場合、PHPは内部的に型変換を試みます。たとえば、max('apple', 'banana')のように文字列を比較すると、辞書順で後ろになる'banana'が返されます。しかし、異なる型の値を比較する際は、予期しない結果になることもあるため注意が必要です。特に、数値から始まる文字列(例: '7apples')は、比較時に数値の7として扱われます。

PHP 8.0以降では、引数が何も渡されなかった場合や、空の配列が渡された場合には、ValueErrorがスローされます。この関数を使うことで、データセットの中から最大値を簡単に特定し、プログラムのロジックに活用することができます。

基本的な使い方

構文(syntax)

<?php
$maximumValue = max(10, 20, 5, 15, 25);
?>

引数(parameters)

array|mixed ...$values

PHP:

  • array|mixed ...$values: 比較する値の配列、または複数の個別の値

戻り値(return)

mixed

指定された引数の中で最も大きい値を返します。引数が配列の場合は、配列内の最も大きい値を返します。

サンプルコード

PHP max() と実行時間制限の関係を示す

<?php

declare(strict_types=1);

/**
 * スクリプトの最大実行時間とmax()関数の関係を示すサンプルです。
 *
 * `max()`関数は、非常に大きな配列を処理する際に時間がかかることがあります。
 * その処理時間がPHPの設定 `max_execution_time` を超えると、
 * スクリプトはタイムアウトエラーで停止します。
 * このコードは、処理時間を計測し、`max_execution_time` との関係を示します。
 */
function demonstrateMaxWithExecutionTime(): void
{
    // php.iniで設定されている現在のスクリプト最大実行時間を取得します。
    // '0' は時間制限がないことを意味します。
    $limit = ini_get('max_execution_time');
    echo "スクリプトの最大実行時間 (max_execution_time): {$limit} 秒" . PHP_EOL;

    // 注意: スクリプト内で実行時間を設定したい場合は set_time_limit() を使います。
    // 例: set_time_limit(10); // タイムアウトを10秒に設定

    // 時間のかかる処理をシミュレートするため、1000万個の要素を持つ配列を生成します。
    echo "大規模な配列を準備しています..." . PHP_EOL;
    $numbers = range(1, 10_000_000);
    // 配列をシャッフルして、max()が単純なスキャンを行うようにします。
    shuffle($numbers);

    // max()関数の処理時間を計測します。
    $startTime = microtime(true);

    // 配列の中から最大値を探します。
    $maxValue = max($numbers);

    $endTime = microtime(true);
    $elapsedTime = $endTime - $startTime;

    echo "処理が完了しました。" . PHP_EOL;
    echo "配列内の最大値: " . $maxValue . PHP_EOL;
    echo "max()関数の処理時間: " . round($elapsedTime, 4) . " 秒" . PHP_EOL;

    // 処理時間が設定された最大実行時間を超えていないか確認します。
    if ((int)$limit > 0 && $elapsedTime > (int)$limit) {
        echo "警告: 処理時間が最大実行時間を超過しました!" . PHP_EOL;
    } else {
        echo "処理は最大実行時間内に完了しました。" . PHP_EOL;
    }
}

// 関数を実行します。
demonstrateMaxWithExecutionTime();

PHPのmax()関数は、引数として与えられた複数の値、または配列の要素の中から最も大きい値を見つけて返す関数です。引数には、複数の値を直接指定する方法と、値が格納された配列を一つだけ指定する方法があります。戻り値は、それらの引数の中で最も大きい値です。

このサンプルコードは、max()関数の処理時間と、PHPのスクリプト実行時間制限であるmax_execution_timeとの関係を示しています。まず、ini_get()関数でPHPに設定されている最大実行時間を取得して表示します。次に、意図的に処理に時間をかけるため、range()関数で1000万個の要素を持つ巨大な配列を生成します。そして、microtime()関数を使ってmax()関数がこの配列から最大値を見つけ出すのにかかった時間を計測します。最後に、計測した処理時間とPHPの最大実行時間を比較し、処理が時間内に完了したかどうかを判定したメッセージを表示します。このコードは、大量のデータを扱う処理がPHPの実行時間制限を超える可能性があることを具体的に確認するためのものです。

max()関数は引数の中から最大値を探す便利な機能ですが、非常に多くの要素を持つ巨大な配列を処理する場合、時間がかかることがあります。この処理時間が、PHPに設定されたスクリプトの最大実行時間(max_execution_time)を超えると、タイムアウトエラーでプログラムが強制終了してしまいます。特に、ユーザーからの入力などデータ量が予測できないケースでは注意が必要です。実行時間制限はサーバー環境によって異なり、set_time_limit()関数で一時的に延長することも可能ですが、大量のデータを扱う際は、処理が時間内に終わるか意識してコードを書くことが大切です。

max_input_vars 設定値と影響を表示する

<?php

/**
 * サーバーの 'max_input_vars' 設定値を取得し、その影響を説明します。
 *
 * 'max_input_vars' は、php.ini で設定されるディレクティブです。
 * この設定は、HTTPのGET, POST, COOKIEリクエストで受け付け可能な
 * 入力変数の最大数を制限します。
 * 例えば、多数のチェックボックスを持つフォームを送信した際に、
 * この上限を超えた項目はサーバー側で無視される可能性があります。
 * この制限は、ハッシュ衝突を利用したサービス妨害攻撃からサーバーを保護するために設けられています。
 */
function displayMaxInputVarsInfo(): void
{
    // ini_get()関数を使用して、現在の 'max_input_vars' の設定値を取得します。
    // 戻り値は文字列型ですが、数値として比較できます。デフォルト値は 1000 です。
    $maxInputVars = ini_get('max_input_vars');

    // サーバーの設定値と、その説明を出力します。
    echo "現在の 'max_input_vars' の設定値: " . $maxInputVars . PHP_EOL;
    echo "これは、フォームなどから一度に受け取れるデータ項目の最大数です。" . PHP_EOL;

    // 実際の入力変数の数を数える例 (このスクリプトにはPOSTデータがないため0になります)
    $postVariableCount = count($_POST);
    echo "このリクエストで受け取ったPOST変数の数: " . $postVariableCount . PHP_EOL;

    // 設定値と実際の入力変数の数を比較します。
    if ($postVariableCount >= $maxInputVars && $maxInputVars > 0) {
        echo "警告: POST変数の数がサーバーの上限に達しているか、超えている可能性があります。" . PHP_EOL;
        echo "一部のフォームデータが失われているかもしれません。" . PHP_EOL;
    } else {
        echo "POST変数の数は上限内に収まっています。" . PHP_EOL;
    }
}

// Webサーバー経由でアクセスされた場合、テキストとして表示するようにヘッダーを設定します。
// コマンドラインから実行した場合は、この処理はスキップされます。
if (php_sapi_name() !== 'cli') {
    header('Content-Type: text/plain; charset=utf-8');
}

// 関数を実行して、設定情報を表示します。
displayMaxInputVarsInfo();

?>

このPHPコードは、サーバーに設定されている max_input_vars の値を取得し、その意味と影響を解説するサンプルです。max_input_vars とは、Webフォームなどから一度に受け取れるデータ(変数)の最大数を制限する、PHPのセキュリティに関する設定項目です。この制限は、意図的に大量のデータを送りつけてサーバーに負荷をかける攻撃を防ぐために設けられています。

コードの中では、まず ini_get() 関数を使って現在の max_input_vars の設定値を取得しています。ini_get() は引数に設定名を文字列で渡すと、その設定値を文字列として返します。次に、count($_POST) を使って、実際にフォームから送信されたデータ項目の数を数えます。$_POST は、POSTメソッドで送信されたデータを格納するPHPの特別な変数です。最後に、実際に受け取った項目の数が設定の上限値に近づいていないかを比較し、超えている可能性がある場合は警告メッセージを表示します。この設定値を超えた分のデータはサーバー側で無視されてしまうため、多数の入力項目を持つフォームなどを開発する際には注意が必要です。

このコードで示されている max_input_varsphp.ini などで設定するサーバー側の設定値です。この上限はPOSTデータだけでなく、GETやCOOKIEで受け取る変数にも適用されます。上限を超えた入力データはエラーを発生させずに超過分が切り捨てられるため、フォームの一部データが欠落する原因となり得ます。このサンプルコードで実際の動作を確認するには、max_input_vars の値を超える項目数のHTMLフォームからデータを送信するテストが必要です。この設定はDoS攻撃を防ぐ目的もあるため、値を大きくする際はセキュリティリスクを考慮してください。

【PHP8.x】max関数の使い方 | いっしー@Webエンジニア