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