【PHP8.x】array_walk()関数の使い方
array_walk関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
array_walk関数は、指定された配列の全ての要素に対して、ユーザー定義のコールバック関数を実行する関数です。この関数は、配列の各要素を順番に処理し、それぞれの要素に対して提供されたコールバック関数を呼び出します。
第一引数には処理対象となる配列を指定します。この配列は参照渡しされるため、コールバック関数内で要素の値を変更すると、元の配列にもその変更が反映されます。第二引数には、配列の各要素に適用したいコールバック関数を指定します。このコールバック関数は、現在の要素の値と、その要素のキーを引数として受け取ります。オプションとして、第三引数に任意のユーザーデータを指定することも可能です。このユーザーデータを指定した場合、コールバック関数は要素の値、キーに加えて、このユーザーデータも引数として受け取ります。
コールバック関数は通常、function (&$value, $key, $userdata = null) のような形式で定義され、$value には要素の値(参照渡し)、$key には要素のキーが渡されます。
array_walk関数は、全ての要素の処理が成功した場合にtrueを返します。何らかの理由で処理が失敗した場合にはfalseを返します。この関数は、配列の要素を一つずつ検査したり、表示したり、あるいは配列の要素を直接変更したりする際に便利です。例えば、配列内の全ての数値に特定の処理を施したり、文字列の書式を整えたりする場合などに利用できます。
構文(syntax)
1<?php 2 3$targetArray = ["apple", "banana", "cherry"]; 4 5$processItem = function (&$itemValue, $itemKey, $optionalUserData = null) { 6 $itemValue = strtoupper($itemValue); 7 8 if ($optionalUserData !== null) { 9 $itemValue .= $optionalUserData; 10 } 11}; 12 13array_walk($targetArray, $processItem, "_MODIFIED"); 14 15?>
引数(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とアロー関数で配列要素を変更する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * array_walkとアロー関数を使って配列の各要素を変更するデモ関数 7 */ 8function walkWithArrowFunction(): void 9{ 10 // 処理対象の配列 11 $fruits = [ 12 'a' => 'apple', 13 'b' => 'banana', 14 'c' => 'cherry', 15 ]; 16 17 echo '変更前の配列:' . PHP_EOL; 18 print_r($fruits); 19 20 // array_walkとアロー関数(fn)を使い、配列の各要素を大文字に変換する 21 // 22 // array_walk は、配列の各要素に対してコールバック関数を適用する 23 // コールバック関数の第1引数($item)を参照渡し(&)にすることで、 24 // 元の配列の要素を直接変更できる 25 // 第2引数($key)で要素のキーも受け取れる 26 array_walk( 27 $fruits, 28 fn (&$item, $key) => $item = strtoupper($item) 29 ); 30 31 echo PHP_EOL . '変更後の配列:' . PHP_EOL; 32 print_r($fruits); 33} 34 35// 関数を実行して結果を表示 36walkWithArrowFunction();
この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() {}形式の無名関数を使う必要があります。
php array_walk で配列要素を更新する
1<?php 2 3// array_walk は、配列の各要素にユーザー定義のコールバック関数を適用します。 4// 配列自体は参照渡しされるため、コールバック関数内で要素の値を変更すると、元の配列も更新されます。 5 6// サンプルで使用する文字列の配列を定義します。 7$fruits = [ 8 'a' => 'apple', 9 'b' => 'banana', 10 'c' => 'cherry', 11]; 12 13// array_walk に渡すコールバック関数を定義します。 14// この関数は、要素の値、キー、そしてオプションのユーザーデータを受け取ります。 15// ここでは、文字列の末尾に指定された接頭辞 (prefix) を追加する処理を行います。 16function addPrefixToFruit(&$value, $key, $prefix) 17{ 18 // $value は参照渡しなので、この変更が元の配列の要素に反映されます。 19 $value = $prefix . $value; 20 echo "キー: '" . $key . "', 値を '" . $value . "' に変更しました。\n"; 21} 22 23echo "--- 変更前の配列 ---\n"; 24print_r($fruits); 25 26// コールバック関数に渡す任意のユーザーデータを定義します。 27// このデータはコールバック関数の第3引数として利用できます。 28$customPrefix = 'delicious_'; 29 30echo "\n--- array_walk 実行中 ---\n"; 31// array_walk 関数を呼び出して、配列の各要素に addPrefixToFruit コールバック関数を適用します。 32// - 第1引数: 処理対象の配列 ($fruits) 33// - 第2引数: 適用するコールバック関数名 ('addPrefixToFruit') 34// - 第3引数: コールバック関数に渡すユーザーデータ ($customPrefix) 35if (array_walk($fruits, 'addPrefixToFruit', $customPrefix)) { 36 echo "\narray_walk は正常に完了しました。\n"; 37} else { 38 echo "\narray_walk は失敗しました。配列に問題があるか、コールバックが無効です。\n"; 39} 40 41echo "\n--- 変更後の配列 ---\n"; 42print_r($fruits); 43 44?>
array_walk関数は、配列の各要素に対して、指定されたコールバック関数を適用するPHPの機能です。主に、配列の要素を巡回しながら、それぞれに特定の処理を実行したい場合に利用されます。
第1引数の&$arrayには処理対象の配列を渡します。この配列は参照渡しされるため、コールバック関数内で要素の値を変更すると、元の配列も直接更新されます。第2引数の$callbackには、配列の各要素に適用したい関数を指定します。このコールバック関数は、要素の値(参照渡し)、キー、そしてオプションのユーザーデータという順番で引数を受け取ります。第3引数の$user_dataは省略可能で、コールバック関数に渡したい任意の追加データを指定できます。戻り値はbool型で、処理が成功した場合はtrue、失敗した場合はfalseを返します。
サンプルコードでは、まず文字列の配列$fruitsを定義し、次にaddPrefixToFruitというコールバック関数を用意しています。この関数は、引数で受け取った接頭辞を各要素の値の先頭に追加し、その変更内容を出力します。array_walkを実行すると、$fruits配列の各要素がaddPrefixToFruit関数によって処理され、$customPrefix('delicious_')が第3引数として渡されます。実行後には、$fruits配列の内容が更新され、各フルーツ名の先頭に'delicious_'が追加されていることが確認できます。
array_walk関数は、配列の各要素に指定したコールバック関数を適用します。特に重要なのは、コールバック関数の第一引数(&$value)が参照渡しであることです。これにより、コールバック関数内で要素の値を変更すると、元の配列のその要素も直接更新されます。意図しない変更を避けるため、この参照渡しの挙動を理解しておく必要があります。
第三引数の$user_dataは、コールバック関数に追加情報を渡す際に利用でき、柔軟な処理を実現します。array_walkは処理の成否を真偽値で返しますので、実行後に戻り値を確認し、失敗時に適切なエラーハンドリングを行うことで、より堅牢なコードになります。コールバック関数は、関数名の文字列だけでなく、無名関数(クロージャ)なども利用可能です。
array_walk_recursiveで多次元配列を操作する
1<?php 2 3/** 4 * array_walk_recursive の使用例を示す関数です。 5 * 多次元配列内のすべての文字列値を大文字に変換します。 6 */ 7function demonstrateArrayWalkRecursive(): void 8{ 9 // サンプルとなる多次元配列を定義します 10 $userProfile = [ 11 'name' => 'Taro Yamada', 12 'contact' => [ 13 'email' => 'taro.yamada@example.com', 14 'phone' => '090-1234-5678' 15 ], 16 'skills' => [ 17 'backend' => 'php', 18 'frontend' => 'javascript' 19 ], 20 'id' => 123, // この数値は変更されません 21 ]; 22 23 // 変更前の配列を表示します 24 echo "--- 変更前の配列 ---" . PHP_EOL; 25 print_r($userProfile); 26 27 /** 28 * 配列の各要素に適用するコールバック関数です。 29 * 値が文字列の場合、その値を大文字に変換します。 30 * 31 * @param mixed &$value 配列の要素の値(参照渡しのため、直接変更可能) 32 * @param string|int $key 配列の要素のキー 33 */ 34 $callback = function (mixed &$value, string|int $key): void { 35 if (is_string($value)) { 36 $value = strtoupper($value); 37 } 38 }; 39 40 // array_walk_recursive を実行して、配列の全要素に再帰的にコールバック関数を適用します 41 // この関数は元の配列を直接変更します 42 array_walk_recursive($userProfile, $callback); 43 44 // 変更後の配列を表示します 45 echo PHP_EOL . "--- 変更後の配列 ---" . PHP_EOL; 46 print_r($userProfile); 47} 48 49// 関数を実行します 50demonstrateArrayWalkRecursive(); 51 52?>
array_walk_recursiveは、多次元配列に含まれる全ての末端の要素に対して、指定した処理を再帰的に実行するためのPHP関数です。階層が深い配列であっても、全ての値に同じ操作を加えたい場合に非常に役立ちます。
この関数の第1引数には、処理対象となる配列を渡します。この配列は関数の内部で直接変更されるため、処理後の結果を新しい変数に代入する必要はありません。第2引数には、各要素に適用する処理内容を定義した「コールバック関数」を指定します。
サンプルコードでは、ユーザー情報を格納した多次元配列$userProfileを定義しています。次に、コールバック関数として「渡された値が文字列であれば、それを大文字に変換する」という処理を定義しています。array_walk_recursiveを実行すると、このコールバック関数が配列内の全ての末端要素に適用されます。その結果、'Taro Yamada'や'php'のような文字列は全て大文字に変換されますが、数値である123は文字列ではないため変更されずに残ります。
この関数の戻り値は、処理の成否にかかわらず常にtrueを返します。このように、元の配列を直接変更しながら、ネストされた配列の要素をまとめて処理できるのが特徴です。
array_walk_recursiveは、元の配列の値を直接書き換える関数です。変更前のデータを残したい場合は、事前に配列をコピーしておく必要があります。値を変更するには、コールバック関数の第一引数を&$valueのように参照渡しにすることが必須です。これを忘れると、元の配列は変更されません。この関数は多次元配列の階層をたどり、配列ではない末端の要素にのみ処理を実行します。キーが'contact'のような、値が配列である要素自体は処理の対象外となる点に注意してください。また、戻り値は処理結果の配列ではなく常にtrueなので、戻り値を変数に代入して利用しないようにしましょう。
PHP: array_walk_recursiveで多次元配列を処理する
1<?php 2 3/** 4 * 多次元配列のすべての要素を再帰的に処理する例。 5 * array_walk_recursive 関数は、配列の各要素にコールバック関数を適用します。 6 * コールバック関数は参照渡しされた値 (&$value)、キー ($key)、 7 * およびオプションのユーザーデータ ($user_data) を受け取ります。 8 */ 9 10// 処理対象の多次元配列を定義します。 11$multidimensionalArray = [ 12 'fruits' => [ 13 'sweet' => ['apple', 'banana'], 14 'sour' => ['lemon', 'grapefruit'], 15 ], 16 'vegetables' => [ 17 'root' => ['carrot', 'potato'], 18 'leafy' => ['spinach', 'lettuce'], 19 ], 20 'numbers' => [10, 20, 30], 21]; 22 23echo "--- 変更前の配列 ---\n"; 24print_r($multidimensionalArray); 25 26// array_walk_recursive を使用して、配列の各要素に処理を適用します。 27// ここでは、文字列型の要素の前にプレフィックスを追加します。 28$prefix = "[ITEM] "; // コールバック関数に渡すユーザーデータ 29 30array_walk_recursive( 31 $multidimensionalArray, // 処理対象の配列(参照渡し) 32 function (&$value, $key, $userData) { // 各要素に適用されるコールバック関数 33 // 値が文字列型の場合のみ処理を行います。 34 if (is_string($value)) { 35 $value = $userData . $value; // ユーザーデータ (プレフィックス) を値の前に付加します 36 } 37 // 数値型の場合、例えば値を2倍にする処理も可能です 38 if (is_numeric($value)) { 39 $value *= 2; 40 } 41 // $key は現在の要素のキーを示しますが、ここでは直接利用していません。 42 }, 43 $prefix // コールバック関数の第3引数 ($userData) として渡されるデータ 44); 45 46echo "\n--- 変更後の配列 ---\n"; 47print_r($multidimensionalArray); 48 49?>
PHPのarray_walk_recursive関数は、多次元配列の全ての要素に対して、指定した処理を再帰的に適用する際に使用します。これは、配列の階層構造を問わず、各要素に一括で同じ加工を行いたい場合に非常に便利な機能です。
この関数は3つの引数を取ります。最初の引数には、処理対象の多次元配列を参照渡しで渡します。これにより、コールバック関数内で要素の値を変更すると、元の配列も直接更新されます。第二引数には、配列の各要素に適用するコールバック関数を指定します。このコールバック関数は通常、現在の要素の値(参照渡し)、そのキー、そしてオプションのユーザーデータの3つの引数を受け取ります。第三引数はオプションで、コールバック関数に渡したい任意の追加データ($user_data)を指定できます。関数は処理が成功した場合にtrueを、失敗した場合はfalseをブール値で返します。
サンプルコードでは、定義した多次元配列$multidimensionalArrayに対し、array_walk_recursiveを適用しています。文字列型の要素には[ITEM] というプレフィックスを付加し、数値型の要素は2倍にする処理を行っています。この[ITEM] という文字列は、第三引数としてコールバック関数に渡され、$valueが参照渡しであるため、結果として$multidimensionalArrayの内容が変更されていることが確認できます。
array_walk_recursiveは、引数で渡された多次元配列をコールバック関数によって直接変更する点に注意が必要です。コールバック関数の第一引数&$valueも参照渡しなので、関数内で$valueを変更すると元の配列の要素に影響します。
コールバック関数の引数は&$value, $key, $userDataの順で固定されており、$valueを参照渡しとすることで要素の値を変更できます。$userDataは、コールバック内で追加の情報を利用したい場合に活用すると便利です。
この関数は、多次元配列のすべてのリーフノードにコールバックを適用します。関数が成功したかどうかは戻り値で確認できますが、コールバック関数の戻り値は利用されません。