あっぽログ
← 記事一覧に戻る

PHPのarray_walk・array_combineを使いこなす:配列操作をさらに深く理解する

はじめに

PHPには配列を操作するための関数が豊富に用意されています。array_maparray_filter などはよく知られていますが、それ以外にも便利な関数がたくさんあります。

この記事では、array_walkarray_combinearray_chunkarray_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_maparray_filter に慣れたら、今回紹介した関数もぜひ取り入れてみてください。コードの可読性と保守性が大きく向上します。

← 記事一覧に戻る