💡 今日の3行まとめ
- 「キーの配列」と「値の配列」を合体させて連想配列を作るときは
array_combine($キー配列, $値配列)を使う forループで添字を1つずつ回す必要がなくなり、1行で意味のわかりやすい連想配列に変換できる- 2つの配列の要素数が違うとエラーになるため、事前に
count()で個数の一致を確かめると安全
1. 今日のお題とゴール
別々に用意された「項目名の配列」と「入力データの配列」を合体させて、キー名でわかりやすく値を取り出せる連想配列を作ります。
- 項目名
['id', 'name', 'role']とデータ['M-101', '佐藤', '編集者']を結合する - 結合する前に、2つの配列の要素数が一致しているかチェックする
- 完成した連想配列からキー名を指定してプロフィールを出力する
// 期待する出力例
ID: M-101
名前: 佐藤
役割: 編集者
2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード
❌ やりがちなNGコードBefore
<?php
$keys = ['id', 'name', 'role'];
$values = ['M-101', '佐藤', '編集者'];
$member = [];
// 添字 $i を使って1件ずつ手動で詰め替える
for ($i = 0; $i < count($keys); $i++) {
$member[$keys[$i]] = $values[$i];
}
echo "ID: {$member['id']}\n";
for ループと添字 [$i] で1件ずつ詰め替えるとコードが長くなり、「2つの配列をペアにしたい」意図がひと目で伝わりません。もし $values の要素が足りないと警告が出て、意図しない null が混ざってしまいます。
⭕ コピペで動く正解コード(PHP 8.3+)After
<?php
declare(strict_types=1);
// 1. 項目名(キーになる配列)と、データ(値になる配列)を用意する
$keys = ['id', 'name', 'role'];
$values = ['M-101', '佐藤', '編集者'];
// 2. 要素数がズレていると ValueError になるため事前にチェックする
if (count($keys) !== count($values)) {
echo "エラー:項目名とデータの数が一致しません。\n";
exit;
}
// 3. キー配列と値配列をペアにして連想配列を1行で生成する
// 結果: ['id' => 'M-101', 'name' => '佐藤', 'role' => '編集者']
$member = array_combine($keys, $values);
// 4. 数字の添字 [0] ではなく、意味のわかるキー名で取り出して出力する
echo "ID: {$member['id']}\n";
echo "名前: {$member['name']}\n";
echo "役割: {$member['role']}\n";
3. ここだけ押さえる!3つのポイント
1
array_combine($キー配列, $値配列) は第1引数がキーになる第1引数の配列が「キー(見出し)」、第2引数の配列が「値(中身)」として先頭から順番にペアになります。引数の順番を逆にするとデータ側がキーになってしまうため、「キーが先、値があと」と覚えましょう。
2PHP 8以降では要素数が異なると
ValueError で停止する2つの配列の個数が1つでもズレていると、ValueError が発生して処理が止まります。外部データや入力値を結合するときは、直前に count($keys) !== count($values) で個数を確認するのが鉄則です。
3同じキー名が重複していると「あと勝ち」で上書きされる
連想配列では同じキー名を複数持てないため、$keys の中に同じ名前があると後ろの要素で上書きされます。項目名の配列には、'id' や 'name' のように重複しない名前を指定しましょう。
4. 1分ミニチャレンジ
🚀 手を動かしてみよう
正解コードの $values から '編集者' を消して2個(['M-101', '佐藤'])に減らし、実行してみましょう。array_combine() の前に count() チェックが働き、安全にエラーメッセージが表示されることを確認できます。