【PHP8.x】array_walk関数の使い方
array_walk関数は、指定された配列の全ての要素に対して、ユーザー定義のコールバック関数を実行する関数です。この関数は、配列の各要素を順番に処理し、それぞれの要素に対して提供されたコールバック関数を呼び出します。
第一引数には処理対象となる配列を指定します。この配列は参照渡しされるため、コールバック関数内で要素の値を変更すると、元の配列にもその変更が反映されます。第二引数には、配列の各要素に適用したいコールバック関数を指定します。このコールバック関数は、現在の要素の値と、その要素のキーを引数として受け取ります。オプションとして、第三引数に任意のユーザーデータを指定することも可能です。このユーザーデータを指定した場合、コールバック関数は要素の値、キーに加えて、このユーザーデータも引数として受け取ります。
コールバック関数は通常、function (&$value, $key, $userdata = null)
のような形式で定義され、$value
には要素の値(参照渡し)、$key
には要素のキーが渡されます。
array_walk関数は、全ての要素の処理が成功した場合にtrue
を返します。何らかの理由で処理が失敗した場合にはfalse
を返します。この関数は、配列の要素を一つずつ検査したり、表示したり、あるいは配列の要素を直接変更したりする際に便利です。例えば、配列内の全ての数値に特定の処理を施したり、文字列の書式を整えたりする場合などに利用できます。
基本的な使い方
構文(syntax)
<?php
$targetArray = ["apple", "banana", "cherry"];
$processItem = function (&$itemValue, $itemKey, $optionalUserData = null) {
$itemValue = strtoupper($itemValue);
if ($optionalUserData !== null) {
$itemValue .= $optionalUserData;
}
};
array_walk($targetArray, $processItem, "_MODIFIED");
?>
引数(parameters)
array &$array, callable $callback, mixed $user_data = null
- array &$array: 処理対象となる配列。参照渡しで渡され、コールバック関数によって直接変更される可能性があります。
- callable $callback: 配列の各要素に対して実行されるコールバック関数。
- mixed $user_data = null: コールバック関数に渡される追加のデータ。デフォルトは null です。
戻り値(return)
bool
array_walk 関数は、配列の各要素にユーザー定義関数を適用します。成功した場合は true を返します。
サンプルコード
PHP array_walk
とアロー関数で配列要素を変更する
<?php
declare(strict_types=1);
/**
* array_walkとアロー関数を使って配列の各要素を変更するデモ関数
*/
function walkWithArrowFunction(): void
{
// 処理対象の配列
$fruits = [
'a' => 'apple',
'b' => 'banana',
'c' => 'cherry',
];
echo '変更前の配列:' . PHP_EOL;
print_r($fruits);
// array_walkとアロー関数(fn)を使い、配列の各要素を大文字に変換する
//
// array_walk は、配列の各要素に対してコールバック関数を適用する
// コールバック関数の第1引数($item)を参照渡し(&)にすることで、
// 元の配列の要素を直接変更できる
// 第2引数($key)で要素のキーも受け取れる
array_walk(
$fruits,
fn (&$item, $key) => $item = strtoupper($item)
);
echo PHP_EOL . '変更後の配列:' . PHP_EOL;
print_r($fruits);
}
// 関数を実行して結果を表示
walkWithArrowFunction();
このPHPコードは、array_walk
関数とアロー関数を使って、配列の各要素の値を直接変更する方法を示しています。
array_walk
は、指定した配列の全ての要素に対して、ユーザーが定義した関数(コールバック関数)を順番に適用するための関数です。戻り値は処理の成功に関わらず常にtrue
を返します。この関数の主な目的は、戻り値を得ることではなく、配列の各要素に対して何らかの操作を行うことです。
第1引数には、処理対象の配列$fruits
を渡します。引数名の前にある&
は「参照渡し」を意味し、関数内で配列の要素を変更すると、元の配列が直接書き換えられることを示します。
第2引数には、各要素に適用する処理を定義したコールバック関数を渡します。このサンプルでは、PHP 7.4で導入されたアロー関数構文fn
を使い、簡潔に関数を記述しています。
アロー関数 fn (&$item, $key) => ...
の引数&$item
は配列の要素の値を、$key
はキーを受け取ります。ここでも$item
は参照渡しになっているため、$item = strtoupper($item)
という処理によって、$fruits
配列の各要素の値が直接大文字に変換されます。
このコードを実行すると、array_walk
によって$fruits
配列の全ての要素が大文字に書き換えられ、変更前と変更後の配列が出力されます。
array_walk
関数は、array_map
と異なり、新しい配列を返さず元の配列を直接変更する目的で使われます。サンプルコードのように配列の要素を書き換えるには、アロー関数の第一引数(値)の前にアンパサンド(&
)を付けて「参照渡し」にする必要があります。この&
を忘れると、関数内で値を変更しても元の配列に反映されないため注意してください。また、array_walk
自体の戻り値は処理結果の配列ではなく、常にtrue
です。処理後の配列が必要な場合は、引数で渡した元の変数(この例では$fruits
)をそのまま利用します。アロー関数は1つの式しか記述できないため、複数行の処理が必要な場合は、従来のfunction() {}
形式の無名関数を使う必要があります。
array_walk_recursiveで多次元配列を操作する
<?php
/**
* array_walk_recursive の使用例を示す関数です。
* 多次元配列内のすべての文字列値を大文字に変換します。
*/
function demonstrateArrayWalkRecursive(): void
{
// サンプルとなる多次元配列を定義します
$userProfile = [
'name' => 'Taro Yamada',
'contact' => [
'email' => 'taro.yamada@example.com',
'phone' => '090-1234-5678'
],
'skills' => [
'backend' => 'php',
'frontend' => 'javascript'
],
'id' => 123, // この数値は変更されません
];
// 変更前の配列を表示します
echo "--- 変更前の配列 ---" . PHP_EOL;
print_r($userProfile);
/**
* 配列の各要素に適用するコールバック関数です。
* 値が文字列の場合、その値を大文字に変換します。
*
* @param mixed &$value 配列の要素の値(参照渡しのため、直接変更可能)
* @param string|int $key 配列の要素のキー
*/
$callback = function (mixed &$value, string|int $key): void {
if (is_string($value)) {
$value = strtoupper($value);
}
};
// array_walk_recursive を実行して、配列の全要素に再帰的にコールバック関数を適用します
// この関数は元の配列を直接変更します
array_walk_recursive($userProfile, $callback);
// 変更後の配列を表示します
echo PHP_EOL . "--- 変更後の配列 ---" . PHP_EOL;
print_r($userProfile);
}
// 関数を実行します
demonstrateArrayWalkRecursive();
?>
array_walk_recursive
は、多次元配列に含まれる全ての末端の要素に対して、指定した処理を再帰的に実行するためのPHP関数です。階層が深い配列であっても、全ての値に同じ操作を加えたい場合に非常に役立ちます。
この関数の第1引数には、処理対象となる配列を渡します。この配列は関数の内部で直接変更されるため、処理後の結果を新しい変数に代入する必要はありません。第2引数には、各要素に適用する処理内容を定義した「コールバック関数」を指定します。
サンプルコードでは、ユーザー情報を格納した多次元配列$userProfile
を定義しています。次に、コールバック関数として「渡された値が文字列であれば、それを大文字に変換する」という処理を定義しています。array_walk_recursive
を実行すると、このコールバック関数が配列内の全ての末端要素に適用されます。その結果、'Taro Yamada'や'php'のような文字列は全て大文字に変換されますが、数値である123
は文字列ではないため変更されずに残ります。
この関数の戻り値は、処理の成否にかかわらず常にtrue
を返します。このように、元の配列を直接変更しながら、ネストされた配列の要素をまとめて処理できるのが特徴です。
array_walk_recursive
は、元の配列の値を直接書き換える関数です。変更前のデータを残したい場合は、事前に配列をコピーしておく必要があります。値を変更するには、コールバック関数の第一引数を&$value
のように参照渡しにすることが必須です。これを忘れると、元の配列は変更されません。この関数は多次元配列の階層をたどり、配列ではない末端の要素にのみ処理を実行します。キーが'contact'
のような、値が配列である要素自体は処理の対象外となる点に注意してください。また、戻り値は処理結果の配列ではなく常にtrue
なので、戻り値を変数に代入して利用しないようにしましょう。