【PHP】配列操作の完全ガイド|array_map・array_filter・array_reduce・usortの使い分け
はじめに
PHPには配列を操作するための関数が豊富に用意されていますが、「どれをどう使い分ければいいのか」迷ったことはありませんか。
array_map と array_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]
引数なしで偽値を除去
コールバックを省略すると null・false・0・空文字などの偽値を除去します。
$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や、パフォーマンスが重要な場面ではネイティブ関数の直接利用が有効です。用途に合わせて使い分けてください。



