# ch07 — キーでソート

Source: https://php-school.pages.dev/topics/array-assoc/ch07-sort-key/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 連想配列
Level: L2

Reference (official): https://www.php.net/manual/ja/language.types.array.php

## 本文

# ch07 — キーでソート

## 概要

前章は **値** で並べ替える `asort` を扱った。この章はもう 1 つの軸、**キーで並べ替える** 関数 **`ksort`** と **`krsort`** を学ぶ。`ksort($arr)` はキーの昇順 (アルファベット順・数字なら小さい順)、`krsort($arr)` は降順 (逆順)、と覚え方はシンプル。`k` がキー (key)、`r` が reverse (逆順) を表している。

使い所は **連想配列を出力する時にキーを揃えたい** 場面。たとえば設定項目を `config.json` 風にダンプする時、キーをアルファベット順に並べておくと差分が読みやすくなる。あるいは「日付をキーにした集計結果」を時系列で並べたい時にも `ksort` が効く。プログラム内部のロジックではなく、**人が見るための出力整形** に多く使われる関数だ。

注意点は前章と同じく **破壊的** な点。元の配列が書き換わるので、ソート前の順序が必要なら別変数にコピーしてから呼ぶ。また `ksort` は文字列キーと数値キーが混在する配列でも動くが、比較ルールが直感と違うことがあるため、本章では **キーがすべて文字列** または **すべて数値** の素直な連想配列だけを扱う。ドリル 01・02 で昇順・降順の両方を出力して、`asort` (値で並べる) との使い分けを身につける。

## 学習目標

- `ksort($arr)` で連想配列をキーの昇順に並べ替えできる
- `krsort($arr)` で連想配列をキーの降順に並べ替えできる
- 値で並べる asort と用途を区別できる

## 所要時間

スライド 4 分 + ドリル 2 問 = **12 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | `ksort` で連想配列をキー昇順に出力 |
| 02 | `krsort` で連想配列をキー降順に出力 |

## 採点

```bash
php scripts/grade.php topics/array-assoc/ch07-sort-key/drill/01-ksort/
```

## 関連チャプター

- [`ch06-sort-asc`](../ch06-sort-asc/) — 値で並べ替える前章
- [`ch04-foreach-key-value`](../ch04-foreach-key-value/) — ソート後の foreach 出力
- [`ch08-array-search`](../ch08-array-search/) — ソートしてから検索する組み合わせ

## スライド

---
marp: true
theme: dojo
paginate: true
size: 16:9
---

<!--
LLM_CONTEXT:
  Lesson 5 / Chapter 7
  目的: ksort で連想配列をキー昇順、krsort でキー降順に並べ替えできるようにする
  扱わない: 値ソート (ch06) / 検索 (ch08) / 多次元 (L6)
  読み上げ時間目安: 3 分半〜4 分
-->

# キーでソート

Lesson 5 / Chapter 7

---

## 値ではなく **キー** で並べたいとき

```php
<?php
$scores = [
    'math'    => 80,
    'english' => 70,
    'science' => 90,
];
```

- `asort` は値の昇順 (ch06)
- 「キー名を辞書順に揃えて出したい」場合は別の関数が必要
- → `ksort` を使う

---

## `ksort($arr)` でキーの昇順

```php
<?php
$scores = [
    'math'    => 80,
    'english' => 70,
    'science' => 90,
];

ksort($scores);
print_r($scores);
```

実行結果:

```
Array
(
    [english] => 70
    [math] => 80
    [science] => 90
)
```

- キーが辞書順 (`english` → `math` → `science`)
- 値はキーにくっついて動く

---

## `krsort($arr)` でキーの降順

```php
<?php
$scores = [
    'math'    => 80,
    'english' => 70,
    'science' => 90,
];

krsort($scores);
print_r($scores);
```

実行結果:

```
Array
(
    [science] => 90
    [math] => 80
    [english] => 70
)
```

- `k` は key、`r` は reverse の意味
- 「逆順に並べたい」時に便利

---

## まとめ: ソート関数の使い分け

| 関数 | 並び替え対象 | キー |
|---|---|---|
| `sort` | 値 (昇順) | 0,1,2 に振り直し |
| `asort` | 値 (昇順) | 残る |
| `ksort` | キー (昇順) | 残る |
| `krsort` | キー (降順) | 残る |

- 連想配列で「キーを残したい」なら `asort / ksort / krsort` を選ぶ
- どれも **元の配列を直接書き換える**

---

## このチャプターでできるようになること

✅ `ksort($arr)` でキー昇順に並べられる
✅ `krsort($arr)` でキー降順に並べられる
✅ asort (値) と ksort (キー) の役割を区別できる
✅ ソート関数の一覧を頭に入れる

→ ドリルへ
