1. ホーム
  2. PHP

【PHP】array_column の使い方|多次元配列から特定キーの値だけを取り出す

Share

データベースから取得したレコードのような「連想配列の配列」(2次元配列)から、特定のキーの値だけをまとめて取り出したい。そんなときに役立つのが PHP の array_column() 関数です。foreach で自前のループを書いて値を集める代わりに、一行で目的の列を抜き出せます。この記事では、array_column() の基本となる第1引数・第2引数の使い方から、第3引数でキーを指定して連想配列を作る方法、第2引数に null を渡して行全体を再インデックスする使い方、オブジェクトの配列に使う場合の注意点まで、コーディング初心者〜中級者の方に向けて php.net の仕様に沿って解説します。

array_column とは何をする関数か

array_column() は、入力した配列の中から「指定した1つの列(カラム)」の値だけを取り出して、新しい配列として返す関数です。名前のとおり、表形式のデータから1つの「列」を縦に抜き出すイメージです。DB の取得結果のように、同じ構造の連想配列がいくつも並んだ2次元配列を扱うときに特に便利です。

たとえばユーザー一覧のような配列があり、その中から名前だけ、あるいは ID だけをまとめて配列にしたい場面はよくあります。これを foreach で書くと数行のループになりますが、array_column() なら一行で済みます。まずは基本の形を見ていきましょう。

基本の使い方|特定キーの値だけを取り出す

最小の使い方は array_column($array, $column_key) です。第1引数に元になる配列、第2引数に取り出したいキー(列の名前)を渡すと、各要素からそのキーの値だけを集めた配列が返ります。次の例では、ユーザーの配列から name の値だけを抜き出しています。

index.php
<?php
$users = [
    ['id' => 1, 'name' => '佐藤', 'age' => 28],
    ['id' => 2, 'name' => '鈴木', 'age' => 34],
    ['id' => 3, 'name' => '高橋', 'age' => 22],
];

// name 列だけを取り出す
$names = array_column($users, 'name');

print_r($names);

実行すると、name の値だけが順番に並んだ配列が得られます。出力結果は次のようになります。

出力結果
Array
(
    [0] => 佐藤
    [1] => 鈴木
    [2] => 高橋
)

返ってくる配列のキーは 0 から始まる連番(添字配列)になります。元の id や順序とは無関係に振り直される点を覚えておきましょう。これと同じことを foreach で書くと、空の配列を用意してループの中で値を詰めていく形になりますが、array_column() なら一行でまとめられます。

第3引数でキーを指定して連想配列を作る

array_column() には第3引数 $index_key があり、ここに別のキーを指定すると、その値を「結果の配列のキー」として使えます。よくあるのは id をキーにして、名前を値にするパターンです。ID から名前を引きたいときに便利な形になります。

index.php
<?php
$users = [
    ['id' => 1, 'name' => '佐藤', 'age' => 28],
    ['id' => 2, 'name' => '鈴木', 'age' => 34],
    ['id' => 3, 'name' => '高橋', 'age' => 22],
];

// id をキー、name を値にする
$nameById = array_column($users, 'name', 'id');

print_r($nameById);
出力結果
Array
(
    [1] => 佐藤
    [2] => 鈴木
    [3] => 高橋
)

結果のキーが id の値(123)になりました。これで $nameById[2] のように、ID を指定して名前をすぐ取り出せます。なお、$index_key に指定したキーの値が複数の要素で重複している場合は、後から登場した要素で上書きされる点に注意してください。一意になるキー(主キーなど)を指定するのが基本です。3つの引数の役割を整理すると次のとおりです。

引数役割
第1引数 $array元になる配列。連想配列の配列(2次元配列)やオブジェクトの配列を渡す
第2引数 $column_key取り出したい列のキー。null を渡すと各要素(行)全体を値にする
第3引数 $index_key(省略可)結果の配列のキーに使う列。省略すると 0 からの連番になる

第2引数に null を渡して行全体を再インデックスする

第2引数 $column_key には null を渡すこともできます。この場合、列を1つだけ抜き出すのではなく、各要素(行)全体がそのまま値になります。第3引数と組み合わせると、「2次元配列を、指定したキーで引けるように作り直す」という使い方ができます。次の例では、id をキーにして各ユーザーの情報全体を引けるようにしています。

index.php
<?php
$users = [
    ['id' => 1, 'name' => '佐藤', 'age' => 28],
    ['id' => 2, 'name' => '鈴木', 'age' => 34],
];

// 第2引数を null にして、行全体を id でキー付けする
$usersById = array_column($users, null, 'id');

print_r($usersById);
出力結果
Array
(
    [1] => Array
        (
            [id] => 1
            [name] => 佐藤
            [age] => 28
        )

    [2] => Array
        (
            [id] => 2
            [name] => 鈴木
            [age] => 34
        )

)

各要素の中身(連想配列)はそのまま残しつつ、外側のキーだけが id の値に変わりました。これにより $usersById[2]['name'] のように、ID から目的のレコードへ直接アクセスできます。DB から取得した結果を ID 引きできる形に変換したいときに便利な書き方です。

オブジェクトの配列にも使える

array_column() は連想配列の配列だけでなく、オブジェクトの配列に対しても使えます。第2引数や第3引数には、オブジェクトの public プロパティの名前を指定します。次の例では、ユーザーを表すオブジェクトの配列から name プロパティを取り出しています。

index.php
<?php
class User
{
    public function __construct(
        public int $id,
        public string $name,
    ) {}
}

$users = [
    new User(1, '佐藤'),
    new User(2, '鈴木'),
    new User(3, '高橋'),
];

// public プロパティ name を取り出し、id をキーにする
$nameById = array_column($users, 'name', 'id');

print_r($nameById);
出力結果
Array
(
    [1] => 佐藤
    [2] => 鈴木
    [3] => 高橋
)

連想配列のときと同じ感覚で、オブジェクトのプロパティを列として扱えます。ただし対象になるのは public なプロパティだけです。privateprotected のプロパティは外部から直接アクセスできないため、array_column() では取り出せません。マジックメソッドの __get() を実装している場合に限り、アクセス不可のプロパティでも取得できるようになります。

指定したキーが存在しないときの挙動

使う前に押さえておきたいのが、第2引数で指定したキーを持たない要素があったときの動きです。array_column() は、$column_key のキーが存在しない要素については、結果から単純に取り除きます。エラーや警告を出して止まるわけではなく、その行が結果に含まれないだけです。

index.php
<?php
$rows = [
    ['id' => 1, 'name' => '佐藤'],
    ['id' => 2],            // name が無い
    ['id' => 3, 'name' => '高橋'],
];

$names = array_column($rows, 'name');

print_r($names);
出力結果
Array
(
    [0] => 佐藤
    [1] => 高橋
)

name を持たない 2 番目の要素は結果に入っていません。そのため、結果の件数が元の配列の件数と一致するとは限らない点に注意が必要です。一方、第3引数の $index_key に指定したキーが存在しない要素については、その値を取り出せた場合でもキーには使われず、連番が振られます。データの構造が一定でない場合は、結果の件数やキーが想定どおりかを確認しておくと安心です。

まとめ

array_column() は、連想配列の配列(2次元配列)から特定のキーの値だけを縦に取り出す関数です。基本は array_column($array, $column_key) で、第3引数 $index_key を渡すとその列の値を結果のキーにできます。id をキーにして名前を引く連想配列を作ったり、第2引数に null を渡して行全体を ID 引きできる形に作り直したりと、DB の取得結果を扱うときに重宝します。オブジェクトの配列でも public プロパティを列として取り出せます。指定したキーを持たない要素は結果から取り除かれるため、件数が変わりうる点だけ意識しておきましょう。foreach で自前のループを書く前に、まず array_column() で済まないかを検討すると、コードがぐっと簡潔になります。

参考ページ