定義と使用方法
- PHPバージョン
- 4.0.5
array_reduce()関数は配列を走査しながらコールバック関数を使用して配列を1つの値に繰り返し縮約(reduce)し単一の値として返します。
特徴
- 配列の要素を走査しながら1つの値に縮約する処理をコールバック関数内に記述します。
- 各段階で縮約された値は
returnキーワードによって返されます。 - 返された値は次の走査で累積値として使用され、同じ処理によって継続的に縮約されます。
- 元の配列はそのまま保持され、最終的に繰り返し縮約された単一の値が返されます。
この関数は配列の要素を利用して単一の特定の値を生成したい場合(またはフィルタリングしたい場合)に非常に有用です。
基本の例
次は、与えられた配列内の各要素の値を合算して1つの値にまとめる際に、array_reduce()関数を活用した有用な例です。
/**
* array_reduce()関数を使用して
* 配列内の全ての要素を加算し累積された1つの値を生成する例
*/
// array_reduce()関数を適用する配列
$array = [1, 2, 3, 4, 5];
// 開発者が独自に作成したコールバック関数
function sum($total, $number) {
// 前回の結果値と現在の要素を加算します
return $total + $number;
}
// 配列内の全要素にコールバック関数を適用し集計した単一の結果値を返却
$result = array_reduce($array, 'sum');
echo $result; // 出力:15
構文
array_reduce(array $array, callable $callback, mixed $initial = null): mixed
引数
$array |
array_reduce()関数に適用する配列です。 |
|---|---|
$callback |
配列の各要素を処理するコールバック関数です。 コールバック関数の引数: $callback($carry, $item)
|
$initial |
オプションです。初期の累積値です。 この引数を省略すると、最初の配列要素が初期の累積値として使用されます。 |
戻り値
結果の値を返します。
配列が空で$initialが渡されていない場合はnullを返します。
コールバック関数の動作原理
callback(mixed $carry, mixed $item): mixed
array_reduce()関数で使用するコールバック関数の構造
/**
* コールバック関数
*
* 名前付き関数(ユーザー定義関数)や無名関数などで使用できます。
*/
/* 名前付き関数をコールバック関数として使用する場合 */
function callback($carry, $item) { // 名前付き関数の定義
// 累積された単一の値の処理:累積結果を返す必要があります
}
array_reduce($array, 'callback'); // 定義した名前付き関数名を引数に文字列で直接渡す
/* 無名関数をコールバック関数として使用する場合 */
array_reduce($array, function($carry, $item) {
// 累積された単一の値の処理:累積結果を返す必要があります
});
array_reduce()関数の引数として渡されるコールバック関数は、配列の要素を処理して1つの結果値を生成する重要な役割を担います。このコールバック関数は繰り返し(iteration)が進むにつれて呼び出され、前回の繰り返しの結果値を$carry変数に保持し、現在の要素の値を$item変数に提供します。以下はコールバック関数の動作原理を詳しく説明したものです。
- 最初の繰り返し(iteration):
array_reduce()関数が呼び出されると、まず初期値($initial)と配列の最初の要素がコールバック関数に渡されます。$carry:初期値($initial)が$carry変数に割り当てられます。$item:配列の最初の要素の値が$item変数に割り当てられます。- コールバック関数が呼び出され、前回の結果値(
$carry)と現在の要素($item)を利用して新しい値を返します。
- 2回目以降の繰り返し(iteration):以降の繰り返しでは初期値(
$initial)は使用されません。代わりに、前回の繰り返しの結果値($carry)と現在の要素($item)がコールバック関数に渡されます。-
$carry:前回の繰り返しで返された値(前回の結果値)が$carry変数に割り当てられます。 -
$item:次の配列要素の値が$item変数に割り当てられます。 -
コールバック関数が呼び出され、前回の結果値(
$carry)と現在の要素($item)を利用して新しい値を返します。
-
- 繰り返し終了:配列の全ての要素が処理されるまで、この繰り返しと結果値の計算が継続されます。
- 最終結果の返却:配列の全ての要素が処理された後、
array_reduce()関数は最後のコールバック関数呼び出しの返り値を最終結果として返します。
まとめると、array_reduce()関数は配列の各要素を処理しながらコールバック関数を呼び出し、コールバック関数は前回の繰り返しの結果値($carry)と現在の要素($item)を基に新しい値を返します。これを繰り返すことで1つの最終結果値を生成します。この仕組みを利用することで、配列の要素を単一の結果値として集計する際にコールバック関数を活用できます。
さまざまな活用例
array_reduce()関数は主に以下のような例で使用されることが多いです。
配列の全ての要素を加算する
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, function ($carry, $item) {
return $carry + $item;
});
echo "配列の全ての要素を加算した結果: $sum"; // 出力:'配列の全ての要素を加算した結果: 15'
配列の全ての要素を乗算する
$numbers = [2, 3, 4, 5];
$product = array_reduce($numbers, function ($carry, $item) {
return $carry * $item;
}, 1); // 初期の累積値を1に設定
echo "配列の全ての要素を乗算した結果: $product"; // 出力:'配列の全ての要素を乗算した結果: 120'
上記のコードでは、初期の累積値として1を使用し、各要素を乗算して結果を累積します。初期の累積値を0に設定すると全ての値が0と乗算されてしまうため、1を使用することが重要です。
配列の最小値を求める
$numbers = [5, 3, 9, 2, 7];
$min = array_reduce($numbers, function ($carry, $item) {
return ($item < $carry) ? $item : $carry;
}, $numbers[0]);
echo "配列の最小値: $min"; // 出力:'配列の最小値: 2'
上記のコードでは、初期の累積値を配列の最初の要素である$numbers[0]に設定し、コールバック関数内で現在の要素が累積値より小さい場合は、その要素を最小値として選択します。
配列の最大値を求める
$numbers = [5, 3, 9, 2, 7];
$max = array_reduce($numbers, function ($carry, $item) {
return ($item > $carry) ? $item : $carry;
}, $numbers[0]);
echo "配列の最大値: $max"; // 出力:'配列の最大値: 9'
上記のコードでも、初期の累積値を配列の最初の要素に設定し、コールバック関数内で現在の要素が累積値より大きい場合は、その要素を最大値として選択します。
配列の全ての要素を文字列として結合する
$words = ['Hello', ' ', 'World', '!'];
$concatenated = array_reduce($words, function ($carry, $item) {
return $carry . $item;
}, '');
echo "配列の全ての要素を結合した結果: $concatenated"; // 出力:'配列の全ての要素を結合した結果: Hello World!'
// implode()関数を使用することも可能です
$implode = implode('', $words);
echo $implode; // 出力:'Hello World!'
上記のコードでは、初期の累積値を空文字列('')に設定し、コールバック関数内で現在の要素を累積値に文字列結合(.)して結果を得ます。これにより、配列の全ての要素が1つの文字列として結合されます。
上記の例の場合、配列を文字列に変換するPHPの組み込み関数であるimplode()関数を使用する方がより効率的な場合があります。