はじめに
PHPには配列を操作するための関数が豊富に用意されています。array_map や array_filter などはよく知られていますが、それ以外にも便利な関数がたくさんあります。
この記事では、array_walk・array_combine・array_chunk・array_column などの関数を具体的なコード例を交えながら解説します。これらを使いこなすことで、ループで書いていた処理をシンプルかつ意図のわかりやすいコードに置き換えられます。
array_walk:配列の各要素に処理を適用する
array_walk は配列の各要素に対してコールバック関数を適用します。array_map と似ていますが、元の配列を直接変更できる点が異なります。
<?php
$prices = [
'apple' => 100,
'banana' => 80,
'cherry' => 200,
];
array_walk($prices, function (&$price, $key) {
$price = "{$key}: {$price}円";
});
print_r($prices);
// Array
// (
// [apple] => apple: 100円
// [banana] => banana: 80円
// [cherry] => cherry: 200円
// )
コールバックの第1引数に & をつけることで元の値を変更できます。第2引数にはキーが渡されるため、キーを使った加工も簡単に行えます。
array_walkと追加データを渡す
第3引数にデータを渡すことも可能です。
<?php
$items = ['shirt', 'pants', 'shoes'];
array_walk($items, function (&$item, $key, $prefix) {
$item = "{$prefix}_{$item}";
}, 'item');
print_r($items);
// Array
// (
// [0] => item_shirt
// [1] => item_pants
// [2] => item_shoes
// )
array_combine:2つの配列からキーと値のペアを作る
array_combine はキー用の配列と値用の配列を組み合わせて、新しい連想配列を作ります。
<?php
$keys = ['name', 'age', 'city'];
$values = ['Alice', 30, 'Tokyo'];
$person = array_combine($keys, $values);
print_r($person);
// Array
// (
// [name] => Alice
// [age] => 30
// [city] => Tokyo
// )
CSVなどのデータをヘッダー行と組み合わせて連想配列化するときに非常に便利です。
<?php
$headers = ['id', 'name', 'email'];
$rows = [
[1, 'Alice', 'alice@example.com'],
[2, 'Bob', 'bob@example.com'],
];
$records = array_map(
fn($row) => array_combine($headers, $row),
$rows
);
print_r($records);
// Array
// (
// [0] => Array ( [id] => 1 [name] => Alice [email] => alice@example.com )
// [1] => Array ( [id] => 2 [name] => Bob [email] => bob@example.com )
// )
array_chunk:配列を指定サイズに分割する
array_chunk は配列を指定した件数ごとに分割します。ページネーションやバッチ処理で活躍します。
<?php
$numbers = [1, 2, 3, 4, 5, 6, 7];
$chunks = array_chunk($numbers, 3);
print_r($chunks);
// Array
// (
// [0] => Array ( [0] => 1 [1] => 2 [2] => 3 )
// [1] => Array ( [0] => 4 [1] => 5 [2] => 6 )
// [2] => Array ( [0] => 7 )
// )
第3引数に true を渡すと、元のキーを保持したまま分割します。
<?php
$data = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
$chunks = array_chunk($data, 2, true);
print_r($chunks);
// Array
// (
// [0] => Array ( [a] => 1 [b] => 2 )
// [1] => Array ( [c] => 3 [d] => 4 )
// )
array_column:多次元配列から特定のカラムを抽出する
array_column はレコードの配列から特定のキーの値だけを取り出します。データベースの取得結果を扱う際に非常に役立ちます。
<?php
$users = [
['id' => 1, 'name' => 'Alice', 'role' => 'admin'],
['id' => 2, 'name' => 'Bob', 'role' => 'editor'],
['id' => 3, 'name' => 'Carol', 'role' => 'viewer'],
];
// name だけを取り出す
$names = array_column($users, 'name');
print_r($names);
// Array ( [0] => Alice [1] => Bob [2] => Carol )
// id をキーとして name を取り出す
$nameById = array_column($users, 'name', 'id');
print_r($nameById);
// Array ( [1] => Alice [2] => Bob [3] => Carol )
第3引数にキーとなるカラム名を渡すと、そのカラムの値をキーにした連想配列を作れます。IDからユーザー名へのマッピングなどに使えます。
組み合わせて使う実践例
これらの関数を組み合わせると、複雑なデータ変換もシンプルに書けます。
<?php
$csvRows = [
['1', 'Alice', '3000'],
['2', 'Bob', '2500'],
['3', 'Carol', '4000'],
];
$headers = ['id', 'name', 'score'];
// ヘッダーと組み合わせて連想配列化
$records = array_map(
fn($row) => array_combine($headers, $row),
$csvRows
);
// score が 2800 以上のレコードを抽出
$filtered = array_filter(
$records,
fn($record) => (int)$record['score'] >= 2800
);
// name だけ取り出す
$names = array_column(array_values($filtered), 'name');
print_r($names);
// Array ( [0] => Alice [1] => Carol )
まとめ
| 関数 | 用途 |
|---|---|
array_walk | 各要素に処理を適用・元の配列を変更 |
array_combine | キー配列と値配列を組み合わせる |
array_chunk | 配列を指定サイズで分割 |
array_column | 多次元配列から特定カラムを抽出 |
PHPの配列操作関数はループを使わずに意図を明確に表現できる強力な道具です。array_map や array_filter に慣れたら、今回紹介した関数もぜひ取り入れてみてください。コードの可読性と保守性が大きく向上します。