array_columnで連想配列の集まりから列を抜き出す

array_columnは、連想配列の配列から特定の列を抜き出す関数です。第3引数でキーを指定すればID引きのマップも作れる、データ整形に出番の多い関数ですね。

DBの結果配列から特定カラムだけ取り出す

PDO の fetchAll などで得られる「連想配列の配列」から、ID だけの一覧が欲しい、みたいな場面はよくありますね。foreach で回して詰め直してもいいのですが、array_column を使えば一行で済みます。

$rows = [
    ['id' => 1, 'name' => '田中'],
    ['id' => 2, 'name' => '佐藤'],
    ['id' => 3, 'name' => '鈴木'],
];
$ids = array_column($rows, 'id');   // [1, 2, 3]
$names = array_column($rows, 'name'); // ['田中', '佐藤', '鈴木']

WHERE id IN (…) を組み立てる前段でよく使う形ですね。ループを書かない分、意図がはっきりします。

第3引数でキーを指定してマップを作る

個人的にいちばん便利だと思うのが第三引数です。ここに列名を渡すと、その値をキーにした連想配列が作れます。ID を引けば行が取れる、という参照用のマップが一発で組めますね。

// id をキー、name を値に
$map = array_column($rows, 'name', 'id');
// [1 => '田中', 2 => '佐藤', 3 => '鈴木']
echo $map[2]; // 佐藤

第二引数に null を渡すと値は行全体になるので、「ID で行を引けるマップ」も作れます。これは後続の突き合わせ処理でかなり効きます。

// id をキーに、行まるごとを値に
$byId = array_column($rows, null, 'id');
echo $byId[3]['name']; // 鈴木

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

意外と知られていませんが、array_column は public プロパティを持つオブジェクトの配列にも効きます。エンティティのリストから特定プロパティを抜く用途にも使えますね。

$users = [new User(1, '田中'), new User(2, '佐藤')];
$ids = array_column($users, 'id'); // publicなidなら取れる

まとめ

array_column は「列を抜く」「キー付きマップを作る」という二役をこなす、地味に出番の多い関数だと思います。特に第三引数でのマップ生成を覚えておくと、二つの配列を ID で突き合わせる処理がぐっと書きやすくなりますね。foreach で詰め替えているコードを見かけたら、置き換えを検討してみるといいかもしれません。

よくある質問

Q. array_columnでID引きのマップは作れますか。
A. 第3引数にキーにしたい列名を渡すと作れます。第2引数にnullを渡せば、値を行全体にできます。

Q. オブジェクトの配列にも使えますか。
A. publicプロパティを持つオブジェクトの配列になら使えます。エンティティのリストから特定プロパティを抜く用途にも向きますね。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です