Menu
CoddyTech

'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を繰り返し呼び出します。この累積処理はすべての要素が処理されるまで続き、最終的な縮約値が得られます。

challenge icon

チャレンジ

簡単

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

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

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

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