'array_walk' による反復処理
CoddyのPHPジャーニー「論理とフロー」セクションの一部。レッスン 44/68。
array_walk() function は、array_map() と比較して、配列を処理するための異なるアプローチを提供します。array_map() が変換された値を持つ新しい配列を作成するのに対し、array_walk() は各要素に callback function をその場で適用することで、元の配列を直接変更します。
このfunctionは、コピーを作成せずに既存のarrayを変更したい場合に特に便利です。指定したcallback functionは、各array要素を参照渡しで受け取るため、元の値を直接modifyできます。
<?php
function addPrefix(&$value, $key) {
$value = "Item: " . $value;
}
$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items は現在: ["Item: apple", "Item: banana", "Item: orange"]
?>callback function が &$value を使用して array 要素を参照渡しで受け取っていることに注目してください。これにより、function は元の array 要素を直接 modify できます。2 番目のパラメーター $key を使うと現在の要素の key にアクセスできますが、単純な変換では必ずしも必要ではありません。
array_walk() は optional な third argument もサポートしており、extra data を callback function に直接渡せます。これは、prefix、suffix、その他の動的な入力など、array の外部で定義された値に変換が依存する場合に便利です。
array_walk() に third argument を渡すと、callback function はそれを third パラメーターとして受け取ります:
<?php
function addCategory(&$value, $key, $category) {
$value = $category . ": " . $value;
}
$products = ["laptop", "mouse", "keyboard"];
$prefix = "Electronics";
array_walk($products, "addCategory", $prefix);
// $products is now: ["Electronics: laptop", "Electronics: mouse", "Electronics: keyboard"]
?>ここでは、$prefix が array_walk() の third argument として渡され、callback はそれを $category として受け取ります。これにより、callback function 内に値をハードコードせずに、異なる prefix で同じ callback function を再利用できます。
チャレンジ
簡単2つの入力を受け取ります。1つ目はコンマ区切りの product names のリスト、2つ目は category prefix です。1つ目の入力には、laptop,mouse,keyboard,monitor の形式の string として product names が含まれ、2つ目の入力は category prefix のテキストです(例:Electronics)。
両方の入力を読み取り、コンマ区切りの product names を array に変換し、各 product name に category prefix を "Category: ProductName" の形式で追加する callback function を作成します。array_walk() を callback function とともに使用して元の array を直接 modify し、各 modified product name を separate line に出力します。
callback function は、array elements を参照渡しで modify するために &$value parameter を使用する必要があります。function は category prefix に colon と space を連結し、その後に product name を続ける必要があります。
Input format:
- First line: コンマ区切りの product names(例:
laptop,mouse,keyboard,monitor) - Second line: category prefix のテキスト(例:
Electronics)
Expected output: 各 modified product name を、Category: ProductName の形式で separate line に出力します。
自分で試してみよう
<?php
// カンマ区切りの商品名を読み取る
$products_input = trim(fgets(STDIN));
// カテゴリの接頭辞を読み取る
$category = trim(fgets(STDIN));
// カンマ区切りの文字列を配列に変換する
$products = explode(',', $products_input);
// TODO: 以下にコードを書いてください
// 各商品名にカテゴリの接頭辞を追加して変更するコールバック関数を作成する
// array_walk() をコールバック関数とともに使用して配列を変更する
// 変更された各商品名を別々の行に出力する
foreach ($products as $product) {
echo $product . "\n";
}
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: PHPオンラインコンパイラ