'array_reduce' による畳み込み
CoddyのPHPジャーニー「論理とフロー」セクションの一部。レッスン 43/68。
array_reduce() 関数は、array_map() や array_filter() とは異なる方法を取ります。新しい配列を返す代わりに、配列内のすべての要素を処理して単一の値を生成します。そのため、合計の計算、最大値の検索、すべての要素を1つの結果にまとめるといった操作に最適です。
この関数は、処理する配列と、要素の結合方法を定義するコールバック関数に加えて、省略可能な第3のパラメーターである初期値を受け取ります。コールバック関数は2つのパラメーターを受け取ります。累積された結果(「carry」と呼ばれます)と、現在の配列要素です。
<?php
function addNumbers($carry, $item) {
return $carry + $item;
}
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, "addNumbers", 0);
// 結果: 15
?>この例では、関数は初期値 0 から始まり、その後、累積合計と各配列要素を使ってaddNumbersを繰り返し呼び出します。この累積処理はすべての要素が処理されるまで続き、最終的な縮約値が得られます。
チャレンジ
簡単2つの入力を受け取ります。1つ目はカンマ区切りの数値のリスト、2つ目は演算の種類です。1つ目の入力には、5,10,15,20,25の形式の文字列として数値が含まれ、2つ目の入力は演算を示す1文字です。Sは合計、Pは積、Mは最大値を表します。
両方の入力を読み取り、カンマ区切りの数値を整数の配列に変換し、指定された演算を実行するカスタムコールバック関数を作成してください。コールバック関数と適切な初期値を使ってarray_reduce()で数値すべてを1つの結果にまとめ、最終結果を出力してください。
演算の詳細:
S(合計):すべての数値を加算します(初期値:0)P(積):すべての数値を乗算します(初期値:1)M(最大値):最大の数値を見つけます(初期値:配列の最初の数値、または非常に小さい数値)
コールバック関数は2つのパラメーターを受け取ります。累積結果(carry)と現在の配列要素(item)です。その後、演算の種類に基づいて更新された累積値を返します。
入力形式:
- 1行目:カンマ区切りの数値(例:
5,10,15,20,25) - 2行目:演算の種類。
S、P、Mのいずれか(例:S)
期待される出力:reduce演算の結果を表す1つの数値
自分で試してみよう
<?php
// 入力を読み取る
$numbers_input = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));
// カンマ区切りの文字列を整数の配列に変換する
$numbers = array_map('intval', explode(',', $numbers_input));
// TODO: 以下にコードを書く
// 演算の種類に応じたコールバック関数を作成する
// コールバック関数と適切な初期値を指定して array_reduce() を使用する
// 結果を出力する
echo $result;
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
6配列の高階関数
'array_map' による変換'array_map' とカスタム関数'array_filter' によるフィルタリング'array_filter' とカスタム関数'array_reduce' による畳み込み'array_walk' による反復処理まとめ:データ処理自分で練習してみよう: PHPオンラインコンパイラ