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

作成日: 更新日:

array_walk_recursive関数は、指定された多次元配列のすべての要素に対して、ユーザー定義のコールバック関数を再帰的に適用する関数です。この関数は、配列の最も深い階層にある要素までを順番に処理します。

第一引数には処理対象となる配列を指定します。この配列の要素は、コールバック関数内で値を変更することも可能です。第二引数には、各配列要素に適用したい処理を定義したコールバック関数を指定します。このコールバック関数は、通常、現在の要素の値とキーの二つの引数を受け取ります。

さらに、オプションで第三引数を指定することも可能です。この第三引数は、コールバック関数に固定の追加データを渡したい場合に利用します。コールバック関数は、最初の二つの引数に加えて、この追加データを第三の引数として受け取ることができます。

この関数は、配列のすべての要素に特定の処理を一括して行いたい場合や、多次元配列の内容を走査して何らかの操作をしたい場合に非常に便利です。たとえば、配列内のすべての文字列を大文字に変換したり、特定の条件を満たす要素に対してログを出力したりする用途に活用できます。

処理が成功した場合はtrueを返し、何らかの問題が発生して処理が失敗した場合はfalseを返します。この関数を使用することで、複雑なループ処理を記述することなく、簡潔に多次元配列の要素操作を行うことができます。

基本的な使い方

構文(syntax)

<?php
$data_array = [
    "category_a" => [
        "item_a1",
        "item_a2",
    ],
    "category_b" => [
        "item_b1",
        "item_b2",
    ],
    "some_value" => 123
];

$user_context = "Processed-";

array_walk_recursive($data_array, function (&$value, $key, $context) {
    if (is_string($value)) {
        $value = $context . strtoupper($value);
    }
}, $user_context);

print_r($data_array);
?>

引数(parameters)

array &$array, callable $callback, mixed $arg = null

  • array & $array: 操作対象の配列。配列は参照渡しされるため、関数内で変更された値が元の配列に反映されます。
  • callable $callback: 配列の各要素に対して実行されるコールバック関数。この関数は、配列のキー、値、そしてオプションの引数を受け取ります。
  • mixed $arg = null: コールバック関数に渡されるオプションの引数。デフォルトはnullです。

戻り値(return)

bool

array_walk_recursive関数は、配列の全要素(ネストされた配列の要素も含む)に対してユーザー定義関数を適用する際に、処理が成功したかどうかを示すboolean値を返します。処理が成功した場合はTRUE、失敗した場合はFALSEを返します。

サンプルコード

PHP array_walk_recursive で多次元配列を処理する

<?php

/**
 * 多次元配列内の特定のキーを持つ値を再帰的にマスキングする関数です。
 *
 * このサンプルは、array_walk_recursive を使用して、階層の深さに関わらず、
 * 配列の末端にある全ての要素をチェックし、条件に一致する値を変更する方法を示します。
 * システム設定ファイルなどから機密情報をログ出力前に隠す、といった実用的な例です。
 */
function maskSensitiveDataExample(): void
{
    // ユーザープロファイルとシステム設定を含む多次元配列
    $data = [
        'user_profile' => [
            'username' => 'alice',
            'password' => 'S3cr3tP@ssw0rd!', // マスキングしたい値
            'contact' => [
                'email' => 'alice@example.com',
                'phone' => '090-1234-5678',
            ],
        ],
        'system_config' => [
            'database' => [
                'dsn' => 'mysql:host=localhost;dbname=testdb',
                'db_password' => 'AnotherS3cr3t!', // マスキングしたい値
            ],
            'api_key' => 'abcdef1234567890', // マスキングしたい値
        ],
        'log_level' => 'debug',
    ];

    echo "--- 処理前のデータ ---" . PHP_EOL;
    print_r($data);

    /**
     * 配列の各要素に適用されるコールバック関数です。
     *
     * @param mixed &$value 要素の値。参照渡し(&)のため、この関数内での変更は元の配列に直接反映されます。
     * @param string|int $key 要素のキー。
     */
    $maskingCallback = function (mixed &$value, string|int $key): void {
        // キー名に 'password' または 'key' が含まれているかチェックします。
        // is_stringでキーが文字列であることも確認し、安全性を高めます。
        if (is_string($key) && (str_contains($key, 'password') || str_contains($key, 'key'))) {
            // 条件に一致した場合、値を固定の文字列で上書きします。
            $value = '********';
        }
    };

    // array_walk_recursive を実行して、配列内のデータを再帰的に処理します。
    // 第1引数に処理対象の配列(参照渡し)、第2引数にコールバック関数を指定します。
    array_walk_recursive($data, $maskingCallback);

    echo PHP_EOL . "--- 処理後のデータ ---" . PHP_EOL;
    print_r($data);
}

// サンプル関数を実行します。
maskSensitiveDataExample();

array_walk_recursiveは、多次元配列のすべての要素(配列の末端にある値)に対して、指定した処理を再帰的に実行するためのPHP関数です。階層の深さに関わらず、配列内のすべての値に対して一括で処理を行いたい場合に非常に便利です。

このサンプルコードは、ユーザー情報やシステム設定が混在した多次元配列 $data を対象に、'password' や 'api_key' といった機密情報を含む値を、安全な固定文字列 '********' に置き換える処理を示しています。

関数の第1引数には、処理対象の配列 $data を指定します。この引数は参照渡し(&)であるため、後述するコールバック関数内で要素の値を変更すると、元の $data 配列が直接書き換えられます。

第2引数には、配列の各要素に適用する処理内容を定義したコールバック関数 $maskingCallback を渡します。このコールバック関数は、要素の値 $value とキー $key を引数として受け取ります。$value も参照渡しになっており、サンプルではキー名に特定の文字列が含まれているかを判定し、条件に一致した場合にこの $value の値を上書きしています。

この関数は処理が成功すると true を返しますが、このサンプルのように元の配列を直接変更することが主目的の場合、戻り値は利用されないこともあります。

array_walk_recursiveは、第一引数で渡した配列を直接変更します。処理前のデータを残したい場合は、実行前に配列をコピーしてください。コールバック関数内で値を変更するには、第一引数を&$valueのように参照渡しで受け取る必要があります。この&を忘れると、元の配列の値は更新されません。この関数が処理するのは多次元配列の末端にある値のみで、途中の配列自体は対象外となる点にも注意が必要です。また、キー名で条件を判定する際は、サンプルにあるようにis_stringなどで型を確認すると、意図しない動作を防ぐことができます。

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