# ch10 — 条件で検索

Source: https://php-school.pages.dev/topics/array-multi/ch10-find-by-key/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: 多次元配列
Level: L2

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

## 本文

# ch10 — 条件で検索

## 概要

オブジェクトリスト (ch09 で扱った連想配列の配列) から「**条件に合う要素だけ取り出す**」のは、データを使う上で必須の操作。「**年齢 20 以上のユーザー**」「**在庫切れの商品**」「**未読のメッセージ**」など、現実のアプリで毎回出てくるパターンだ。書き方は単純で、**`foreach` で 1 件ずつ取り出し、`if` で条件を判定して、合致するものだけ処理する** という素朴な線形検索になる。

基本形は `foreach ($users as $user) { if ($user['age'] >= 20) { echo $user['name'] . "\n"; } }`。**foreach の中に if を入れる** だけで、データベースの `WHERE` 句に相当する絞り込みができる。条件は `>=` (以上) / `===` (厳密一致) / `&&` (かつ) など組み合わせて自由に書ける。複雑な条件でも 1 件ずつ判定すれば必ず正しい結果が出るので、まずはこの素朴な書き方を確実に書けるようになる。

慣れてくると `array_filter` でも書ける。`array_filter($users, fn($u) => $u['age'] >= 20)` のようにアロー関数で条件を書くと、絞り込み結果の配列が返ってくる。ただし最初は **foreach + if** で「条件を満たすものだけ何かをする」というロジックを **自分の手で書く** 経験を積むほうが、後で `array_filter` を読んだ時の理解が深まる。線形検索は計算量 O(N) だが、ch12 や実務でも十分使えるパターン。

## 学習目標

- オブジェクトリストから条件に合う要素だけ取り出せる
- `foreach` + `if` で「条件を満たすものだけ処理する」パターンを書ける
- 検索条件 (`>=` `===` など) を組み合わせられる

## 所要時間

スライド 4 分 + ドリル 1 問 = **10 分**

## ドリル

| no | 内容 |
|---|---|
| 01 | 年齢 20 以上の人の名前だけ出力 |

## 採点

```bash
php scripts/grade.php topics/array-multi/ch10-find-by-key/drill/01-find-by-age/
```

## 関連チャプター

- [`ch09-objects-list`](../ch09-objects-list/) — オブジェクトリストの構造 (この章の前提)
- [`ch11-csv-to-2d`](../ch11-csv-to-2d/) — CSV を 2 次元配列にしてから検索する応用
- [`ch12-summary`](../ch12-summary/) — 検索 + 集計を組み合わせた総合演習

## スライド

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

<!--
LLM_CONTEXT:
  Lesson 6 / Chapter 10
  目的: オブジェクトリストから foreach + if で条件に合う要素を絞り込めるようにする
  扱わない: CSV パース (ch11) / 総合演習 (ch12)
  読み上げ時間目安: 3 分半〜4 分
-->

# 条件で検索する

Lesson 6 / Chapter 10

---

## foreach + if で絞り込む

```php
<?php
$users = [
    ['name' => '太郎', 'age' => 20],
    ['name' => '花子', 'age' => 25],
    ['name' => '次郎', 'age' => 18],
];
foreach ($users as $user) {
    if ($user['age'] >= 20) {
        echo $user['name'] . "\n";
    }
}
```

実行結果:

```
太郎
花子
```

- 全件を 1 件ずつ見て、条件を満たすときだけ出力
- 「フィルタ」と呼ばれるパターン

---

## 複数条件は `&&` `||`

```php
<?php
foreach ($users as $user) {
    // 20 歳以上 かつ 30 歳未満
    if ($user['age'] >= 20 && $user['age'] < 30) {
        echo $user['name'] . "\n";
    }
}
```

- `&&` (かつ) `||` (または) で複数の条件をつなげる
- 比較演算子は conditional トピックで学んだものをそのまま使える

---

## 「最初に見つかったものだけ」が欲しいなら break

```php
<?php
foreach ($users as $user) {
    if ($user['age'] >= 20) {
        echo $user['name'] . "\n";
        break;   // 最初に見つかった 1 件で終了
    }
}
```

実行結果:

```
太郎
```

- 1 件だけ欲しい場合は `break` でループを抜ける
- loop トピックで学んだ `break` をここでも使える

---

## キーが存在するかチェック

```php
<?php
foreach ($users as $user) {
    if (isset($user['age']) && $user['age'] >= 20) {
        echo $user['name'] . "\n";
    }
}
```

- 一部の要素に `age` が無い可能性があるなら `isset` で先に確認
- いきなり `$user['age']` を比較すると、キーが無い件で警告が出る

---

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

✅ `foreach + if` で条件に合う要素だけ取り出せる
✅ `&&` `||` で複数の条件をつなげられる
✅ `break` で最初の 1 件だけ取り出せる
✅ `isset` でキー存在を先に確認できる

→ ドリルへ
