【PHP】配列操作の完全ガイド|array_map・array_filter・array_reduce・usortの使い分け

はじめに

PHPには配列を操作するための関数が豊富に用意されていますが、「どれをどう使い分ければいいのか」迷ったことはありませんか。

array_maparray_filter の違い、array_reduce の使い方、usort でのカスタムソートなど、実務で頻出の関数を整理してコード例つきで解説します。

Laravelを使っている方も、Collectionメソッドの裏側を理解するうえでPHPネイティブの配列関数を知っておくことは重要です。

PHPの主要な配列操作関数一覧

関数用途
array_map各要素を変換して新しい配列を返す
array_filter条件に合う要素だけ残す
array_reduce畳み込んで単一の値を返す
array_walk各要素に処理を実行(元の配列を変更)
usortカスタム比較関数でソート(インデックスリセット)
uasortカスタム比較関数でソート(キー保持)
uksortキーに対してカスタムソート
array_column多次元配列から特定カラムを取り出す
array_combineキー配列と値配列を合体
array_flipキーと値を入れ替える
array_unique重複を除去
array_chunk配列を指定サイズに分割

array_map

各要素に関数を適用して、変換結果を新しい配列として返します。元の配列は変更されません。

基本的な使い方

$prices = [100, 200, 300];

$taxed = array_map(fn($price) => $price * 1.1, $prices);
// [110.0, 220.0, 330.0]

複数の配列を同時に処理

array_map は複数の配列を同時に渡せます。

$names  = ['Alice', 'Bob', 'Carol'];
$scores = [85, 92, 78];

$result = array_map(fn($name, $score) => "$name: $score点", $names, $scores);
// ['Alice: 85点', 'Bob: 92点', 'Carol: 78点']

null を渡してzip的に使う

コールバックに null を渡すと、複数配列をまとめた多次元配列になります。

$result = array_map(null, ['a', 'b', 'c'], [1, 2, 3]);
// [['a', 1], ['b', 2], ['c', 3]]

注意: array_map はキーを保持しません。連想配列に使うとキーが数値にリセットされる場合があります。キーを保持したい場合は array_walk を使うか、array_combine で後からキーを付け直してください。

array_filter

条件に合う要素だけを残した配列を返します。元の配列は変更されません。

基本的な使い方

$numbers = [1, 2, 3, 4, 5, 6];

$even = array_filter($numbers, fn($n) => $n % 2 === 0);
// [1 => 2, 3 => 4, 5 => 6]  ※キーは保持される

注意: array_filter はキーを保持するため、インデックスが飛びます。連続したインデックスが必要な場合は array_values() でリセットしてください。

$even = array_values(array_filter($numbers, fn($n) => $n % 2 === 0));
// [0 => 2, 1 => 4, 2 => 6]

引数なしで偽値を除去

コールバックを省略すると nullfalse0・空文字などの偽値を除去します。

$clean = array_filter([1, null, 2, false, 3, '', 0]);
// [0 => 1, 2 => 2, 4 => 3]

連想配列への適用

$users = [
    ['name' => 'Alice', 'active' => true],
    ['name' => 'Bob',   'active' => false],
    ['name' => 'Carol', 'active' => true],
];

$active = array_filter($users, fn($user) => $user['active']);
// Alice と Carol のみ残る

ARRAY_FILTER_USE_KEY / ARRAY_FILTER_USE_BOTH

第3引数でキーや「キーと値の両方」をコールバックに渡すことができます。

$data = ['foo' => 1, 'bar' => 2, 'baz' => 3];

// キーでフィルタ
$result = array_filter($data, fn($key) => str_starts_with($key, 'b'), ARRAY_FILTER_USE_KEY);
// ['bar' => 2, 'baz' => 3]

// キーと値の両方でフィルタ
$result = array_filter($data, fn($value, $key) => $value > 1 && $key !== 'baz', ARRAY_FILTER_USE_BOTH);
// ['bar' => 2]

array_reduce

配列を畳み込んで単一の値を返します。合計・最大値・カスタム集計など柔軟に使えます。

基本的な使い方

$numbers = [1, 2, 3, 4, 5];

$sum = array_reduce($numbers, fn($carry, $item) => $carry + $item, 0);
// 15

第3引数は初期値です。省略すると null になります。

配列を別の形に変換する

array_reduce は数値だけでなく、配列やオブジェクトに畳み込むこともできます。

$orders = [
    ['status' => 'completed', 'amount' => 200],
    ['status' => 'pending',   'amount' => 150],
    ['status' => 'completed', 'amount' => 300],
];

// ステータスごとに金額を集計
$totals = array_reduce($orders, function ($carry, $order) {
    $carry[$order['status']] = ($carry[$order['status']] ?? 0) + $order['amount'];
    return $carry;
}, []);

// ['completed' => 500, 'pending' => 150]

array_walk

各要素に処理を実行します。array_map と違い、元の配列を直接変更します。戻り値は true/false です。

$prices = ['apple' => 100, 'banana' => 200, 'cherry' => 300];

array_walk($prices, function (&$price, $key) {
    $price = "$key: {$price}円";
});

// ['apple' => 'apple: 100円', 'banana' => 'banana: 200円', 'cherry' => 'cherry: 300円']

キーも使いたい場合や、元の配列を直接変更したい場合に使います。

ソート系関数

sort / rsort

値でソートします。キーはリセットされます。

$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
sort($numbers);
// [1, 1, 2, 3, 4, 5, 6, 9]

rsort($numbers); // 降順

asort / arsort

値でソートしますが、キーを保持します。

$scores = ['Alice' => 85, 'Bob' => 92, 'Carol' => 78];
asort($scores);
// ['Carol' => 78, 'Alice' => 85, 'Bob' => 92]

ksort / krsort

キーでソートします。

$data = ['banana' => 2, 'apple' => 1, 'cherry' => 3];
ksort($data);
// ['apple' => 1, 'banana' => 2, 'cherry' => 3]

usort(カスタムソート)

独自の比較ロジックでソートします。キーはリセットされます。

$users = [
    ['name' => 'Charlie', 'age' => 28],
    ['name' => 'Alice',   'age' => 30],
    ['name' => 'Bob',     'age' => 25],
];

usort($users, fn($a, $b) => $a['age'] <=> $b['age']);

// Bob(25), Charlie(28), Alice(30) の順

<=> は宇宙船演算子で、左辺が小さければ -1、等しければ 0、大きければ 1 を返します。

降順にしたい場合は $a$b を入れ替えます。

usort($users, fn($a, $b) => $b['age'] <=> $a['age']);

uasort(キー保持のカスタムソート)

usort と同じですが、キーを保持します。連想配列をソートする際に使います。

$scores = ['Alice' => 85, 'Bob' => 92, 'Carol' => 78];
uasort($scores, fn($a, $b) => $a <=> $b);
// ['Carol' => 78, 'Alice' => 85, 'Bob' => 92]

その他よく使う配列関数

array_column

多次元配列から特定のカラムを取り出します。pluck 相当の処理がネイティブでできます。

$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
    ['id' => 3, 'name' => 'Carol'],
];

$names = array_column($users, 'name');
// ['Alice', 'Bob', 'Carol']

// 第3引数でインデックスキーを指定
$nameById = array_column($users, 'name', 'id');
// [1 => 'Alice', 2 => 'Bob', 3 => 'Carol']

array_combine

2つの配列をキーと値として結合します。

$keys   = ['name', 'age', 'email'];
$values = ['Alice', 30, 'alice@example.com'];

$user = array_combine($keys, $values);
// ['name' => 'Alice', 'age' => 30, 'email' => 'alice@example.com']

array_chunk

配列を指定サイズに分割します。バッチ処理に便利です。

$ids = [1, 2, 3, 4, 5, 6, 7];

$chunks = array_chunk($ids, 3);
// [[1, 2, 3], [4, 5, 6], [7]]

第3引数に true を渡すとキーを保持します。

実務でよく使うパターン

多次元配列を特定キーでグループ化

$orders = [
    ['status' => 'completed', 'amount' => 200],
    ['status' => 'pending',   'amount' => 150],
    ['status' => 'completed', 'amount' => 300],
];

$grouped = [];
foreach ($orders as $order) {
    $grouped[$order['status']][] = $order;
}
// または array_reduce で実装

配列から重複を除去してインデックスをリセット

$tags = ['php', 'laravel', 'php', 'mysql'];
$unique = array_values(array_unique($tags));
// ['php', 'laravel', 'mysql']

連想配列のキーでフィルタして値のみ取り出す

$config = ['db_host' => 'localhost', 'db_port' => 3306, 'app_name' => 'MyApp'];

$dbConfig = array_filter(
    $config,
    fn($key) => str_starts_with($key, 'db_'),
    ARRAY_FILTER_USE_KEY
);
// ['db_host' => 'localhost', 'db_port' => 3306]

IDをキーにした連想配列を作る

$users = [
    ['id' => 1, 'name' => 'Alice'],
    ['id' => 2, 'name' => 'Bob'],
];

$userById = array_column($users, null, 'id');
// [1 => ['id' => 1, 'name' => 'Alice'], 2 => ['id' => 2, 'name' => 'Bob']]

まとめ

関数キー保持元の配列戻り値
array_map✗(数値キーにリセット)変更しない新しい配列
array_filter変更しない新しい配列
array_reduce変更しない単一の値
array_walk変更するtrue/false
usort変更するtrue/false
uasort変更するtrue/false

Laravelを使う場合はCollectionのメソッドを使うほうが可読性が高いですが、フレームワークなしのPHPや、パフォーマンスが重要な場面ではネイティブ関数の直接利用が有効です。用途に合わせて使い分けてください。

PHPPHP

Posted by 千原 耕司