Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. array_reduce() / array_walk()

array_reduce() / array_walk()対応: PHP 4(2000)

配列の要素を1つの値に集約したり、各要素に対して順番に処理を実行する関数です。

構文
// 配列の要素をコールバック関数で順番に処理し、1つの値に集約します。
array_reduce(配列, コールバック関数, 初期値);

// 配列の各要素にコールバック関数を適用します。元の配列が直接変更されます。
array_walk(配列, コールバック関数, 追加データ);
関数一覧
関数概要
array_reduce($array, $callback, $initial)配列の要素を先頭から順に処理し、1つの値に集約して返します。コールバック関数には「これまでの結果」と「現在の要素」が渡されます。
array_walk($array, $callback, $arg)配列の各要素にコールバック関数を適用します。コールバック関数の第1引数は参照渡しで、元の配列を直接変更できます。
サンプルコード
<?php
// 配列の合計を計算します。
$prices = [150, 80, 300, 200];
$total = array_reduce($prices, fn($carry, $item) => $carry + $item, 0);
echo $total; // 『730』と出力されます。

// 最大値を求めます。
$scores = [85, 92, 78, 95, 88];
$max = array_reduce($scores, fn($carry, $item) => max($carry, $item), 0);
echo $max; // 『95』と出力されます。

// 配列の要素を文字列に結合します。
$words = ['PHP', 'は', '楽しい'];
$sentence = array_reduce($words, fn($carry, $item) => $carry . $item, '');
echo $sentence; // 『PHPは楽しい』と出力されます。

// 連想配列をHTMLのオプションタグに変換します。
$options = ['jp' => '日本', 'us' => 'アメリカ', 'uk' => 'イギリス'];
$html = array_reduce(
    array_keys($options),
    fn($carry, $key) => $carry . "\n",
    ''
);
echo $html; // HTMLのoptionタグが出力されます。

// array_walkで配列の各要素を加工します。
$items = ['りんご', 'みかん', 'ぶどう'];
array_walk($items, function(&$value, $key) {
    $value = ($key + 1) . '. ' . $value; // 番号を付与します。
});
print_r($items); // 各要素に番号が付きます。

// array_walkで連想配列を加工します。
$prices = ['りんご' => 150, 'みかん' => 80, 'ぶどう' => 300];
array_walk($prices, function(&$price, $name, $tax_rate) {
    $price = (int)($price * $tax_rate); // 税込価格に変換します。
}, 1.1);
print_r($prices); // 税込価格に変更されます。
概要

『array_reduce()』は配列の全要素を1つの値にまとめる関数です。コールバック関数の第1引数には前回の処理結果が、第2引数には現在の要素が渡されます。第3引数の初期値は最初の呼び出し時に第1引数として使用され、省略すると『null』になります。

『array_walk()』は配列の各要素にコールバック関数を適用する関数で、コールバック関数の第1引数を参照渡し『&$value』にすると元の配列を直接変更できます。第3引数に追加データを渡すこともでき、税率のような共通パラメータを各要素の処理に使いたい場合に便利です。

単純な合計や要素数の計算には『array_sum() / count()』のほうが簡潔です。各要素を変換して新しい配列を作りたい場合は『array_map()』を使用してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。