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

作成日: 更新日:

array_any関数は、指定された配列のいずれかの要素が特定の条件を満たすかどうかを判定する関数です。この関数は、最初の引数として処理対象の配列を受け取ります。二番目の引数には、配列の各要素に適用する条件を定義するコールバック関数を指定します。コールバック関数は、配列の要素を一つずつ受け取り、その要素が条件を満たす場合にtrueを、満たさない場合にfalseを返します。

array_any関数は、配列の要素を順に評価し、コールバック関数が一度でもtrueを返した場合、ただちにtrueを返して処理を終了します。もし配列のすべての要素に対してコールバック関数がfalseを返した場合、最終的にfalseを返します。これにより、配列内に特定の条件に合致する要素が一つでも存在するかどうかを効率的に確認できます。

例えば、「配列に5より大きい数値が含まれているか」といったチェックを行う際に有用です。この関数は、大規模な配列の中から特定の条件を満たす要素が一つでも存在するかどうかを素早く判定する必要がある場合に、コードの可読性を高め、簡潔に記述できるメリットがあります。

基本的な使い方

構文(syntax)

array_any(array $array, callable $callback): bool

引数(parameters)

array $array, callable $callback

  • array $array: 検査対象の配列
  • callable $callback: 配列の各要素に対して実行されるコールバック関数

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP array_anyで要素の条件一致を調べる

<?php

/**
 * 配列のいずれかの要素が指定された条件を満たすかどうかをチェックします。
 *
 * @param array<mixed> $array    チェック対象の配列。
 * @param callable(mixed $value): bool $callback 各要素に対して適用されるコールバック関数。
 *                                                trueを返した場合、その要素は条件を満たします。
 * @return bool いずれかの要素が条件を満たす場合はtrue、それ以外はfalseを返します。
 */
function array_any(array $array, callable $callback): bool
{
    foreach ($array as $value) {
        if ($callback($value)) {
            return true; // 条件を満たす要素が1つでも見つかればtrueを返す(ショートサーキット評価)
        }
    }
    return false; // どの要素も条件を満たさなかった場合
}

// --- サンプルコードの使用例 ---

// 例1: 配列に偶数が含まれるかチェック
$numbers = [1, 3, 5, 7, 8, 9];
$hasEven = array_any($numbers, fn($num) => $num % 2 === 0);
echo "配列 [" . implode(', ', $numbers) . "] に偶数が含まれますか? " . ($hasEven ? "はい" : "いいえ") . PHP_EOL;

// 例2: 配列に特定の文字列が含まれるかチェック (大文字小文字を区別しない)
$fruits = ['apple', 'banana', 'Orange', 'grape'];
$hasOrange = array_any($fruits, fn($fruit) => strtolower($fruit) === 'orange');
echo "配列 [" . implode(', ', $fruits) . "] に 'orange' が含まれますか? " . ($hasOrange ? "はい" : "いいえ") . PHP_EOL;

// 例3: 配列に10より大きい数値が含まれるかチェック
$scores = [5, 8, 12, 3, 9];
$hasHighScores = array_any($scores, fn($score) => $score > 10);
echo "配列 [" . implode(', ', $scores) . "] に10より大きい数値が含まれますか? " . ($hasHighScores ? "はい" : "いいえ") . PHP_EOL;

// 例4: 条件を満たす要素がない場合
$emptyOrNoMatch = [1, 2, 3];
$hasNegative = array_any($emptyOrNoMatch, fn($num) => $num < 0);
echo "配列 [" . implode(', ', $emptyOrNoMatch) . "] に負の数が含まれますか? " . ($hasNegative ? "はい" : "いいえ") . PHP_EOL;

?>

PHPのarray_any関数は、与えられた配列の要素の中に、特定の条件を満たすものが一つでも存在するかどうかを判定するために使用する関数です。

第一引数の$arrayには、条件をチェックしたい要素を持つ配列を指定します。第二引数の$callbackには、配列の各要素に対して適用される関数(コールバック関数)を指定します。このコールバック関数は、配列の個々の要素を受け取り、その要素が条件を満たす場合はtrueを、満たさない場合はfalseを返すように定義します。

array_any関数は、$array内のいずれかの要素が$callbackによってtrueと評価された場合、その時点で処理を中断し、直ちに全体としてtrueを返します。これを「ショートサーキット評価」と呼びます。もし、配列のすべての要素が$callbackの条件を満たさなかった場合(つまり、すべての要素でfalseが返された場合)、array_any関数は最終的にfalseを返します。この関数の戻り値は、条件を満たす要素が存在するかどうかを示す真偽値(bool)です。例えば、数値の配列に偶数が含まれるか、特定の文字列があるか、といった様々な条件を簡潔にチェックする際に役立ちます。

array_any関数は、配列の要素に対して条件を満たすものが1つでもあればtrueを返す便利な関数です。コールバック関数は各要素に対して実行され、trueまたはfalseを返す必要があります。コールバック関数内では、strtolowerなどの関数を使用して、文字列の比較で大文字小文字を区別しないようにできます。条件を満たす要素が見つかった時点で関数はtrueを返すため、配列全体が処理されるわけではないことに注意してください。配列が空の場合、常にfalseが返されます。コールバック関数内でエラーが発生しないように、引数の型や値の範囲を適切にチェックすることが重要です。

PHP array_any ポリフィルで配列要素をチェックする

<?php

if (!function_exists('array_any')) {
    /**
     * 配列のいずれかの要素が、指定されたコールバック関数の条件を満たすかチェックします。
     *
     * この関数は、PHPに将来追加される可能性のある array_any() のポリフィル(互換機能)です。
     * コールバック関数が true を返した最初の要素が見つかった時点で true を返し、
     * すべての要素が条件を満たさない場合は false を返します。
     *
     * @param array    $array    チェック対象の配列。
     * @param callable $callback 各要素に適用するコールバック関数。bool 値を返す必要があります。
     *                         シグネチャ: bool callback(mixed $value, mixed $key): bool
     * @return bool いずれかの要素が条件を満たせば true、そうでなければ false。
     */
    function array_any(array $array, callable $callback): bool
    {
        foreach ($array as $key => $value) {
            // コールバック関数を実行し、結果が true であれば、即座に true を返す
            if ($callback($value, $key)) {
                return true;
            }
        }

        // ループが終了しても条件を満たす要素がなかった場合は false を返す
        return false;
    }
}

// --- 以下、サンプルコード ---

// チェック対象の数値配列
$scores = [65, 80, 55, 92, 78];

// 例1: 配列に90点以上のスコアが1つでも存在するかチェックする
$hasTopScore = array_any($scores, function (int $score): bool {
    return $score >= 90;
});

echo '90点以上のスコアは存在しますか?: ';
var_dump($hasTopScore); // bool(true) - 92が条件を満たすため

// 例2: 配列に50点未満のスコアが1つでも存在するかチェックする(アロー関数を使用)
$hasFailingScore = array_any($scores, fn(int $score): bool => $score < 50);

echo '50点未満のスコアは存在しますか?: ';
var_dump($hasFailingScore); // bool(false) - 条件を満たすスコアがないため

// 例3: 空の配列で実行した場合
$resultForEmpty = array_any([], fn($v) => true);

echo '空の配列の場合はどうなりますか?: ';
var_dump($resultForEmpty); // bool(false) - チェック対象の要素がないため

このPHPコードは、配列の要素の中に指定した条件を満たすものが1つでも存在するかを判定する array_any 関数を定義し、その使用例を示しています。この関数は、将来PHPに導入されるかもしれない同名の関数を現在の環境でも利用できるようにするための「ポリフィル」です。

関数の第1引数 $array には、チェック対象の配列を渡します。第2引数 $callback には、各要素が条件を満たすかどうかを判定するための「コールバック関数」を指定します。このコールバック関数は、要素を1つずつ受け取り、条件に合致すれば true、合致しなければ false を返すように記述します。

array_any 関数は、配列の要素を順に調べ、コールバック関数が true を返した時点で、ただちに true を返して処理を終了します。もし、すべての要素を調べても条件を満たすものが見つからなかった場合や、配列が空だった場合は false を返します。

サンプルコードの例1では、点数配列の中に「90点以上」の要素があるかを調べて true を得ています。例2では、より簡潔なアロー関数という書き方で「50点未満」の要素をチェックし、該当がないため false となっています。例3は、空の配列では常に false が返されることを示しています。

このarray_any関数は、PHPに標準で存在する機能ではなく、将来追加される可能性のある機能を事前に利用する「ポリフィル」です。そのため、ご利用のPHPバージョンや他のライブラリとの競合に注意が必要です。

本関数は、配列内のいずれかの要素がコールバック関数の条件を満たせばtrueを、一つも満たさなければfalseを返します。コールバック関数は、各要素に対してtrueまたはfalseを返すように実装してください。条件を満たす要素が最初に見つかった時点で処理を終了しtrueを返すため、大規模な配列でも効率的に動作します。空の配列を渡した場合、チェック対象の要素がないため常にfalseが返されることを覚えておきましょう。

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