'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引数も受け取ります。これは、コールバックに第3引数として直接渡される追加データです。これは、変換が配列の外で定義された値に依存する場合に便利です。
<?php
function addPrefix(&$value, $key, $prefix) {
$value = $prefix . $value;
}
$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix", "Item: ");
// $items は現在: ["Item: apple", "Item: banana", "Item: orange"]
?>ここでは、文字列
"Item: " が array_walk() の第3引数として渡され、コールバック内で $prefix として受け取られます。これにより、同じコールバックを異なる追加値で再利用できます。このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単2つの入力を受け取ります。1つはカンマ区切りの製品名のリスト、もう1つはカテゴリのプレフィックスです。最初の入力は laptop,mouse,keyboard,monitor のような形式の文字列として製品名を含み、2番目の入力はカテゴリのプレフィックス・テキスト(例:Electronics)です。
両方の入力を読み込み、カンマ区切りの製品名を配列に変換し、各製品名に "Category: ProductName" という形式でカテゴリのプレフィックスを追加するコールバック関数を作成してください。array_walk() をコールバック関数と共に使用して元の配列を直接変更し、変更された各製品名を個別の行に出力してください。
コールバック関数は、配列の要素を参照によって変更するために &$value パラメータを使用する必要があります。関数は、カテゴリのプレフィックスにコロンとスペースを繋げ、その後に製品名を連結する必要があります。
入力形式:
- 1行目: カンマ区切りの製品名(例:
laptop,mouse,keyboard,monitor) - 2行目: カテゴリのプレフィックス・テキスト(例:
Electronics)
期待される出力: 変更された各製品名が Category: ProductName の形式で個別の行に出力されること
チートシート
array_walk() 関数は、新しい配列を作成する array_map() とは異なり、各要素にコールバック関数をインプレースで適用することで、元の配列を直接変更します。
コールバック関数は、&$value を使用して各配列要素を参照として受け取るため、元の値を直接変更できます。2番目のパラメータ $key は、現在の要素のキーへのアクセスを提供します。
array_walk() は、オプションの3番目の引数も受け取ります。これは、コールバックに3番目のパラメータとして渡される追加データです。これは、各要素を処理するためにコールバックが追加情報を必要とする場合に便利です。
<?php
function addPrefix(&$value, $key) {
$value = "Item: " . $value;
}
$items = ["apple", "banana", "orange"];
array_walk($items, "addPrefix");
// $items is now: ["Item: apple", "Item: banana", "Item: orange"]
// Using the optional third argument (extra data):
function applyPrefix(&$value, $key, $prefix) {
$value = $prefix . $value;
}
$fruits = ["apple", "banana", "orange"];
array_walk($fruits, "applyPrefix", "Fresh: ");
// $fruits is now: ["Fresh: apple", "Fresh: banana", "Fresh: orange"]
?>自分で試してみよう
<?php
// カンマ区切りの商品名を読み込む
$products_input = trim(fgets(STDIN));
// カテゴリの接頭辞を読み込む
$category = trim(fgets(STDIN));
// カンマ区切りの文字列を配列に変換する
$products = explode(',', $products_input);
// TODO: 以下にコードを記述してください
// 各商品名にカテゴリの接頭辞を追加して修正するコールバック関数を作成する
// array_walk() とコールバック関数を使用して配列を修正する
// 修正された各商品名を個別の行に出力する
foreach ($products as $product) {
echo $product . "\n";
}
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。