# ch06 — 値で昇順ソート

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

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

## 本文

# ch06 — 値で昇順ソート

## 概要

配列を **小さい順 (昇順) に並べ替える** のに使うのが **`sort`** と **`asort`** の 2 つ。どちらも「値で並べる」のは同じだが、**キーを残すかどうか** が大きく違う。`sort($arr)` は添字配列向けで、並べ替えた後にキーが 0, 1, 2... と振り直される。一方 `asort($arr)` は連想配列向けで、**元のキーをそのまま保ったまま** 値の順で並べ直す。

たとえば `['banana' => 3, 'apple' => 1, 'cherry' => 2]` に `asort` をかけると `['apple' => 1, 'cherry' => 2, 'banana' => 3]` になる。キーと値のペアが崩れずに値の順番だけが変わるので、「金額順に商品名を表示する」「スコア順に名前を出す」といったランキング出力の定番関数になっている。`sort` を連想配列に使うとキーが消えてしまうため、連想配列なら基本 `asort` だと覚えておくと安全だ。

PHP のソート関数のもう 1 つの特徴は **破壊的** であること。返り値は成功した時の `true` であって、並べ替え後の新しい配列ではない。元の `$arr` 自体が書き換わるので、元の順序を残したい時は `$copy = $arr` でコピーしてから渡す。この章ではドリル 01・02 で `sort` の基本、03 で `asort` の挙動を比べて、「キーが消えるか残るか」の差を体感する。

## 学習目標

- `sort($arr)` で添字配列を昇順に並べ替えできる
- `asort($arr)` で **キーを保ったまま** 連想配列を値で昇順にできる
- `sort` と `asort` の違いを言える

## 所要時間

スライド 4 分 + ドリル 3 問 = **15 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | 整数の添字配列を `sort` で昇順出力 |
| 02 | 文字列の添字配列を `sort` で昇順出力 |
| 03 | 連想配列を `asort` で値の昇順に並べ、キーと値を出力 |

## 採点

```bash
php scripts/grade.php topics/array-assoc/ch06-sort-asc/drill/01-sort-int/
```

## 関連チャプター

- [`ch04-foreach-key-value`](../ch04-foreach-key-value/) — ソート後の foreach 出力で使う
- [`ch07-sort-key`](../ch07-sort-key/) — キーで並べ替える次の章
- [`ch05-array-keys-values`](../ch05-array-keys-values/) — `array_values` でキーを捨てて添字配列にしてからソートするパターン

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 5 / Chapter 6
  目的: sort で添字配列を昇順に、asort で連想配列を値の昇順に並べ替えできるようにする
  扱わない: キーで並べる ksort (ch07) / 降順 rsort (発展) / 検索 (ch08)
  読み上げ時間目安: 3 分半〜4 分
-->

# 値で昇順ソート

Lesson 5 / Chapter 6

---

## `sort($arr)` で添字配列を昇順に並べ替え

```php
<?php
$nums = [3, 1, 4, 1, 5];

sort($nums);

print_r($nums);
```

実行結果:

```
Array
(
    [0] => 1
    [1] => 1
    [2] => 3
    [3] => 4
    [4] => 5
)
```

- `sort` は **元の配列そのものを** 並べ替える (戻り値ではなく副作用)
- 添字 `0, 1, 2, ...` が振り直される

---

## 文字列の配列も `sort` で並ぶ

```php
<?php
$names = ['banana', 'apple', 'cherry'];

sort($names);

print_r($names);
```

実行結果:

```
Array
(
    [0] => apple
    [1] => banana
    [2] => cherry
)
```

- 文字列は **辞書順 (ABC 順)** に並ぶ

---

## 連想配列で `sort` を使うとキーが消える

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

sort($scores);
print_r($scores);
```

実行結果:

```
Array
(
    [0] => 70
    [1] => 80
    [2] => 90
)
```

- キー (`math` など) が消えて `0, 1, 2` になってしまう
- **連想配列でキーを残したい時は `asort` を使う**

---

## `asort($arr)` でキーを保ったまま値の昇順

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

asort($scores);
print_r($scores);
```

実行結果:

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

- キーと値の対応はそのまま
- 並び順だけが「値の昇順」に変わる

---

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

✅ `sort($arr)` で添字配列を昇順に並べられる
✅ 連想配列に `sort` を使うとキーが消えると理解
✅ `asort($arr)` で連想配列を値の昇順に並べられる
✅ どちらも **元の配列を直接書き換える** と分かる

→ ドリルへ
