Caution

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

PHP辞典

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

array_map() / array_filter()対応: PHP 4(2000)

配列の各要素にコールバック関数を適用して変換したり、条件に基づいて要素を抽出する関数です。

構文
// 配列の各要素にコールバック関数を適用して新しい配列を返します。
array_map(コールバック関数, 配列1, 配列2, ...);

// 配列の各要素をコールバック関数で評価し、条件を満たす要素だけの配列を返します。
array_filter(配列, コールバック関数, フラグ);
関数一覧
関数概要
array_map($callback, $array, ...)配列の各要素にコールバック関数を適用し、その戻り値で構成された新しい配列を返します。元の配列は変更されません。
array_filter($array, $callback, $flag)コールバック関数が『true』を返した要素だけを含む配列を返します。コールバック関数を省略すると、空の値を除外します。
サンプルコード
<?php
// 各要素を2倍にした新しい配列を作成します。
$numbers = [1, 2, 3, 4, 5];
$doubled = array_map(fn($n) => $n * 2, $numbers);
print_r($doubled); // 『2, 4, 6, 8, 10』の配列になります。

// 文字列の配列をすべて大文字に変換します。
$words = ['hello', 'world', 'php'];
$upper = array_map('strtoupper', $words);
print_r($upper); // 『HELLO, WORLD, PHP』になります。

// 連想配列の値を加工します。
$prices = ['りんご' => 150, 'みかん' => 80, 'ぶどう' => 300];
$with_tax = array_map(fn($price) => (int)($price * 1.1), $prices);
print_r($with_tax); // 各価格に10%の税を加算した値になります。

// 偶数だけを抽出します。
$nums = [1, 2, 3, 4, 5, 6, 7, 8];
$evens = array_filter($nums, fn($n) => $n % 2 === 0);
print_r($evens); // 偶数の『2, 4, 6, 8』だけが残ります。

// 空の値を除外します。コールバックを省略すると自動で除外されます。
$data = ['太郎', '', '花子', null, '次郎', 0, false];
$clean = array_filter($data);
print_r($clean); // 空の値がすべて除外されます。

// 連想配列から条件に合う要素を抽出します。
$stock = ['りんご' => 5, 'みかん' => 0, 'ぶどう' => 12, 'もも' => 0];
$available = array_filter($stock, fn($qty) => $qty > 0);
print_r($available); // 在庫がある商品だけが残ります。
概要

『array_map()』は配列の各要素を変換して新しい配列を作成する関数です。コールバック関数には関数名の文字列、無名関数、アロー関数のいずれも指定できます。複数の配列を渡すと、各配列の同じインデックスの要素がコールバック関数の引数として渡されます。

『array_filter()』は条件を満たす要素だけを抽出する関数です。コールバック関数を省略すると、『false』『null』『空文字列』『0』などの空の値をすべて除外します。ただし『0』も除外されるため、数値の0を残したい場合はコールバック関数で明示的に条件を指定してください。

『array_filter()』の結果はキーが保持されるため、キーが飛び飛びになることがあります。連番のキーが必要な場合は『array_values()』で振り直してください。配列の集約処理については『array_reduce()』を参照してください。

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