Menu
Coddy logo textTech

'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 として受け取られます。これにより、同じコールバックを異なる追加値で再利用できます。
quiz icon腕試し

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

quiz icon腕試し

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

quiz icon腕試し

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

challenge icon

チャレンジ

簡単

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

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

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