'array_reduce' による畳み込み
CoddyのPHPジャーニー「論理とフロー」セクションの一部 — レッスン 43/68。
array_reduce() 関数は、array_map() や array_filter() とは異なるアプローチを取ります。新しい配列を返す代わりに、配列内のすべての要素を処理して単一の値を生成します。これにより、合計の計算、最大値の検索、またはすべての要素を1つの結果に結合するなどの操作に最適です。
この関数は、処理する配列、要素を結合する方法を定義するコールバック関数、およびオプションの初期値という3つのパラメータを必要とします。コールバック関数は、累積された結果(「キャリー」と呼ばれます)と現在の配列要素の2つのパラメータを受け取ります。
<?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つはカンマ区切りの数値リスト、もう1つは操作タイプです。最初の入力は 5,10,15,20,25 のような形式の文字列として数値を含み、2番目の入力は操作を示す1文字です。S は合計(sum)、P は積(product)、M は最大値(maximum)を表します。
両方の入力を読み込み、カンマ区切りの数値を整数の配列に変換し、指定された操作を実行するカスタムコールバック関数を作成してください。array_reduce() を作成したコールバック関数および適切な初期値とともに使用して、すべての数値を1つの結果に処理し、最終的な結果を出力してください。
操作の詳細:
S(合計): すべての数値を加算します(初期値: 0)P(積): すべての数値を乗算します(初期値: 1)M(最大値): 最も大きな数値を見つけます(初期値: 配列の最初の数値、または非常に小さな数値)
コールバック関数は、累積された結果(carry)と現在の配列要素(item)の2つのパラメータを受け取り、操作タイプに基づいて更新された累積値を返す必要があります。
入力形式:
- 1行目: カンマ区切りの数値 (例:
5,10,15,20,25) - 2行目: 操作タイプ -
S,P, またはM(例:S)
期待される出力: reduce操作の結果を表す単一の数値
チートシート
array_reduce() 関数は、配列内のすべての要素を処理して単一の値を生成します。合計の計算や要素の結合に最適です。
この関数には、処理する配列、コールバック関数、およびオプションの初期値の3つのパラメータが必要です。コールバックは、蓄積された結果(carry)と現在の配列要素を受け取ります。
<?php
function addNumbers($carry, $item) {
return $carry + $item;
}
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, "addNumbers", 0);
// 結果: 15
?>結果を小数点以下2桁にフォーマットするには、number_format($total, 2) を使用します。
自分で試してみよう
<?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' による反復処理まとめ:データ処理