連想配列
キーと値で構造化されたデータを扱う
キーと値のペアで値を持つ「連想配列」を扱うトピック。foreach の走査と、キー / 値でのソート・検索まで一通り押さえる。
このトピックで身につくこと
['key' => 値]の形で連想配列を作って読み書きできるforeach ($arr as $k => $v)でキーと値を同時に取り出せるarray_keys/array_valuesでキー一覧 / 値一覧を取れるsort/asort/ksort/krsortを使い分けられるin_array/array_searchで値を検索できる
前提知識の要点
このトピックは hello の echo / 変数 / 入力と、array-basic の添字配列の知識を前提にする。要点だけ:
<?php
// 1) 出力 / 変数展開 (ダブルクォート必須)
$name = "太郎";
echo "こんにちは{$name}\n";
// 2) 標準入力 (1 行)
$line = trim(fgets(STDIN));
// 3) 添字配列の基本
$nums = [10, 20, 30];
echo $nums[0]; // 10
$nums[] = 40; // 末尾に追加
echo count($nums); // 4
// 4) foreach で値だけ走査 (このトピックではキー付きも扱う)
foreach ($nums as $v) {
echo $v, "\n";
}| やりたいこと | 書き方 |
|---|---|
| 画面に出す | echo "..."; |
| 変数展開 | "こんにちは{$name}" (ダブルクォート必須) |
| 入力 (文字列) | $line = trim(fgets(STDIN)); |
| 添字配列を作る | $arr = [10, 20, 30]; |
| 末尾に追加 | $arr[] = 40; |
| 全要素を走査 | foreach ($arr as $v) { ... } |
これで OK。詳しくやりたければ hello / array-basic トピックへ。
chapter 一覧
| # | chapter | 内容 | 学習目標 |
|---|---|---|---|
| 1 | ch01-assoc-basic/ |
連想配列を作る | ['key' => 値] で連想配列を作り $arr['key'] で取り出せる |
| 2 | ch02-assoc-modify/ |
追加・上書き・削除 | $arr['key'] = 値 で追加・上書き、unset() で削除できる |
| 3 | ch03-foreach-value/ |
foreach で値だけ走査 | foreach ($arr as $v) で全要素の値を取り出せる |
| 4 | ch04-foreach-key-value/ |
foreach でキーと値 | foreach ($arr as $k => $v) でキーと値を同時に取れる |
| 5 | ch05-array-keys-values/ |
キー一覧 / 値一覧 | array_keys() / array_values() を使い分けられる |
| 6 | ch06-sort-asc/ |
値で昇順ソート | sort() / asort() の違いを言える |
| 7 | ch07-sort-key/ |
キーでソート | ksort() / krsort() を使える |
| 8 | ch08-array-search/ |
検索 | in_array() / array_search() で値を探せる |
合計 8 chapter / 21 drill / 所要 約 2 時間。
進め方
- 各 chapter の
slide.mdを読む (3〜4 分) drill/配下の問題を順番に解く- 採点:
php scripts/grade.php topics/array-assoc/<chapter>/drill/<drill>/
つまづきポイント
| 症状 | 多くの原因 |
|---|---|
Undefined array key "name" |
存在しないキーを参照している → isset($arr['name']) で確認 |
| キーの順番が入れ替わる | sort() を使った (添字を振り直す) → 連想配列を残したいなら asort() / ksort() |
foreach で値が変わらない |
as &$v (参照) を使わないと元配列は書き換わらない |
Array to string conversion |
配列を echo で直接出力した → print_r() か var_dump() を使う |
| キーに数字を使ったら添字配列になった | 数字キーは整数として扱われる → 文字列キーで持ちたいなら "01" のようにクォートで囲む |
関連トピック
| トピック | 関係 |
|---|---|
| hello | このトピックの前提 (echo / 変数 / 入力) |
| array-basic | このトピックの前提 (添字配列・count・foreach の基本形) |
| array-multi | 連想配列の配列で「表」や「オブジェクトリスト」を扱う |
| function | 連想配列を引数や戻り値として渡す |
| db | DB の 1 行は連想配列で返ってくる (['id' => 1, 'name' => '太郎']) |
| web | $_GET / $_POST / $_SESSION はすべて連想配列 |
トピックを並列で参照する全体地図は TOPICS_INDEX.md にある。
案件 (dojo_map.tsv) での参照
topic_slug chapter_dir
array-assoc topics/array-assoc/ch01-assoc-basic
array-assoc topics/array-assoc/ch04-foreach-key-value
array-assoc topics/array-assoc/ch06-sort-asc
...
slug array-assoc で参照可。05-array-assoc / array-assoc どちらの path でもアクセスできる (シンボリックリンク)。