# ch08 — 配列の中を検索する

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

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

## 本文

# ch08 — 配列の中を検索する

## 概要

配列を扱う時に避けて通れないのが **「この値 (キー) は入ってる？」を調べる検索処理**。PHP には用途に応じて 3 つの関数が用意されていて、何を知りたいかで使い分ける。**値の有無を真偽で知りたい** なら `in_array($needle, $arr)`、**見つかった位置 (キーまたは添字) を取りたい** なら `array_search($needle, $arr)`、**キーが存在するかを知りたい** なら `array_key_exists($key, $arr)` を使う。

注意したいのが、それぞれ **見ているものが違う** こと。`in_array` と `array_search` は **値** を探すのに対し、`array_key_exists` は **キー** を探す。さらに `array_key_exists` は値が `null` でもキーが存在すれば `true` を返すという、`isset` との違いがある。`isset($arr['key'])` は値が `null` だと `false` を返すので、「null も含めて存在判定したい」時は `array_key_exists` を選ぶ。

そして実務で必ず引っかかるのが **比較の厳密さ**。`in_array('1', [1, 2, 3])` はデフォルトで `true` になる (`'1'` と `1` が等しい扱い)。これを嫌う場合は **第 3 引数 `true`** を渡して厳密比較 (`===`) に切り替える。文字列と数値が混ざる配列を検索する時は、第 3 引数を意識しないと **意図しないヒットでバグになる** ので、ここは強く覚えておく。ドリル 2 問で `in_array` と `array_search` の最小限の挙動を確かめる。

## 学習目標

- `in_array($needle, $arr)` で値が含まれるか真偽で判定できる
- `array_search($needle, $arr)` で見つかった位置 (キーまたは添字) を取れる
- `array_key_exists($key, $arr)` でキーの存在を判定できる

## 所要時間

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

## ドリル

| no | 内容 |
|---|---|
| 01 | `in_array` で値の有無を判定 |
| 02 | `array_search` で見つかった位置 (添字) を出力 |

## 採点

```bash
php scripts/grade.php topics/array-assoc/ch08-array-search/drill/01-in-array/
```

## 関連チャプター

- [`ch02-assoc-modify`](../ch02-assoc-modify/) — `unset` 前のキー存在チェック
- [`ch05-array-keys-values`](../ch05-array-keys-values/) — キー一覧を取り出してから検索する代替アプローチ
- [`ch07-sort-key`](../ch07-sort-key/) — ソート後の配列で検索する組み合わせ

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 5 / Chapter 8
  目的: in_array / array_search / array_key_exists で配列の中身を検索できるようにする
  扱わない: 多次元 (L6) / 関数 (L7) / クラス (L8)
  読み上げ時間目安: 3 分半〜4 分
-->

# 配列を検索する

Lesson 5 / Chapter 8

---

## `in_array` — 値が含まれるか (真偽)

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

if (in_array('banana', $fruits)) {
    echo "ある\n";
} else {
    echo "ない\n";
}
```

実行結果:

```
ある
```

- 戻り値は `true / false`
- 「あるか・ないか」だけ知りたい時に使う

---

## `array_search` — 見つかった位置を取る

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

$pos = array_search('banana', $fruits);
echo $pos . "\n"; // 1
```

- 戻り値は **キー** (添字配列なら 0,1,2... / 連想配列ならキー名)
- 見つからない時は `false` が返る (※真偽は `===` で比較すること)

---

## 連想配列でも `array_search` が使える

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

$key = array_search(90, $scores);
echo $key . "\n"; // science
```

- 戻り値はキー名 (`science`)
- 「点数 90 を取った科目を知りたい」のような用途

---

## `array_key_exists` — キーがあるか

```php
<?php
$person = ['name' => '太郎', 'age' => 20];

if (array_key_exists('age', $person)) {
    echo "age あり\n";
}
```

- `in_array` は **値** を、`array_key_exists` は **キー** を探す
- `isset` でも似たことができるが、値が `null` のときの挙動が違う

---

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

✅ `in_array` で値の有無を判定できる
✅ `array_search` で見つかった位置を取れる
✅ `array_key_exists` でキーの存在を判定できる
✅ 「値を探す」「キーを探す」を使い分けられる

→ ドリルへ
