Menu
Coddy logo textTech

'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"]
?>

ここでは、$prefixarray_walk() の third argument として渡され、callback はそれを $category として受け取ります。これにより、callback function 内に値をハードコードせずに、異なる prefix で同じ callback function を再利用できます。

challenge icon

チャレンジ

簡単

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";
}
?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理とフローのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ