- 連想配列のリストから特定のキーの値だけを取り出すなら
array_column()が最短 - 第3引数に
'id'などを指定すると「IDをキーにした検索用の辞書配列」が1行で作れる - 存在しないIDを参照したときの警告は、Null合体演算子
??で安全に回避できる
1. 今日のお題とゴール
データベースやAPIから取得した「ユーザー一覧の配列」から、名前だけのリストを作ったり、特定のIDのユーザー名を素早く引き当てたりする処理を書いてみましょう。
- ユーザー配列から「名前(
name)だけの配列」を取り出す - 「
idをキー、nameを値」にした連想配列(辞書)を作る - 指定したID(
102と999)の名前を表示し、未登録なら「未登録」と出力する
// 期待する出力例
名前リスト: 佐藤, 鈴木, 高橋
ID:102 の名前: 鈴木
ID:999 の名前: 未登録
2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード
<?php
$names = [];
$userMap = [];
foreach ($users as $user) {
$names[] = $user['name'];
$userMap[$user['id']] = $user['name'];
}
echo $userMap[999]; // Warning: Undefined array key 999
毎回空の配列を用意して foreach で詰め替えると、コードが長くなり記述ミスも増えます。さらに、存在しないキー(999)をそのまま参照するとPHPのWarning(未定義キー警告)が発生してしまいます。
<?php
declare(strict_types=1);
$users = [
['id' => 101, 'name' => '佐藤', 'role' => 'admin'],
['id' => 102, 'name' => '鈴木', 'role' => 'editor'],
['id' => 103, 'name' => '高橋', 'role' => 'viewer'],
];
// 1. 'name' カラムだけを抜き出して配列にする
// 結果: ['佐藤', '鈴木', '高橋']
$names = array_column($users, 'name');
// 2. 第3引数に 'id' を指定し、[id => name] の辞書配列を作る
// 結果: [101 => '佐藤', 102 => '鈴木', 103 => '高橋']
$userMap = array_column($users, 'name', 'id');
// 3. 結果の出力(存在しないIDは ?? で初期値を返す)
echo '名前リスト: ' . implode(', ', $names) . PHP_EOL;
foreach ([102, 999] as $targetId) {
$userName = $userMap[$targetId] ?? '未登録';
echo "ID:{$targetId} の名前: {$userName}" . PHP_EOL;
}
3. ここだけ押さえる!3つのポイント
array_column($users, 'name') と書くだけで、各要素の name だけを集めた新しい配列が作れます。foreach で空配列に $names[] = ... と追加する定型コードはもう不要です。
第3引数に 'id' を渡すと、配列の添字(インデックス)が 0, 1, 2 から 101, 102, 103 に変わります。毎回ループを回してIDを探すよりも、$userMap[102] で直接引けるため処理も高速です。
$userMap[$targetId] ?? '未登録' と書けば、キーが存在するときはその値を、存在しないときは右側の初期値を返してくれます。isset() の三項演算子よりも短く安全に書ける現代PHPの必須テクニックです。
4. 1分ミニチャレンジ
🚀 手を動かしてみよう
array_column($users, null, 'id') のように第2引数を null にして、print_r() で中身を確認してみましょう。
ヒント:名前だけでなく、role を含む「1人分の配列丸ごと」をIDから一発で引ける辞書配列が作れます!