前回、PHPの「配列」を勉強しました。
例えば、こんな配列です。
$users = [
[
'name' => 'みのり',
'age' => 18
],
[
'name' => '田中',
'age' => 25
],
[
'name' => '佐藤',
'age' => 32
]
];
3人分のデータが $users に入っています。
では、全員の名前を画面に表示したいとします。
前回の知識だけでもできます。
echo $users[0]['name'];
echo $users[1]['name'];
echo $users[2]['name'];
これで、
みのり
田中
佐藤
を取り出せます。
でも……
100人いたらどうするのでしょう?
echo $users[0]['name'];
echo $users[1]['name'];
echo $users[2]['name'];
echo $users[3]['name'];
echo $users[4]['name'];
// まだまだ続く……
これは大変です。
そこで登場するのが、
foreach
です。
1.foreachは「順番に1個ずつ見ていく」
まずはコードを見てみましょう。
foreach ($users as $user) {
echo $user['name'];
}
初めて見ると、
なんだこの英文は。
と思うかもしれません。
でも、やっていることはかなり単純です。
イメージとしては、
$users に入っているデータを
↓ 1件取り出す
$user
↓ 次の1件を取り出す
$user
↓ また次の1件を取り出す
$user
という処理です。
つまり、
「$usersの中身を1件ずつ$userとして処理する」
と考えればOKです。
2.foreach ($users as $user)を分解してみる
この部分を見てみましょう。
foreach ($users as $user)
3つに分けると分かりやすくなります。
foreach
↓
順番に処理する
$users
↓
元になる配列
as $user
↓
取り出した1件を入れる変数
日本語っぽく読むなら、
$usersの中身を、1件ずつ$userとして処理する
です。
英語の as も、
「〜として」
くらいに考えると分かりやすいでしょう。
3.実際には何が起きている?
もう一度、この配列を使います。
$users = [
[
'name' => 'みのり',
'age' => 18
],
[
'name' => '田中',
'age' => 25
],
[
'name' => '佐藤',
'age' => 32
]
];
そして、
foreach ($users as $user) {
echo $user['name'];
}
を実行します。
最初の処理では、
$user = [
'name' => 'みのり',
'age' => 18
];
のような状態になります。
だから、
$user['name']
は、
みのり
です。
次の処理では、
$user = [
'name' => '田中',
'age' => 25
];
になります。
だから、
$user['name']
は、
田中
になります。
そして最後に、
佐藤
が取り出されます。
つまりPHPが自動的に、
1件目 → 2件目 → 3件目
と進めてくれているわけです。
4.100件あってもコードは同じ
ここが foreach の便利なところです。
3件でも、
foreach ($users as $user) {
echo $user['name'];
}
です。
100件でも、
foreach ($users as $user) {
echo $user['name'];
}
です。
1000件でも基本的な書き方は変わりません。
配列の件数に合わせて、PHPが繰り返してくれます。
5.HTMLと組み合わせると一気に「Web制作」っぽくなる
例えば、ユーザー一覧を作ってみましょう。
$users = [
[
'name' => 'みのり',
'age' => 18
],
[
'name' => '田中',
'age' => 25
],
[
'name' => '佐藤',
'age' => 32
]
];
これをHTMLのリストにします。
<ul>
<?php foreach ($users as $user): ?>
<li>
<?= htmlspecialchars($user['name'], ENT_QUOTES, 'UTF-8') ?>
</li>
<?php endforeach; ?>
</ul>
急に難しく見えましたね。
でも、やっていることは同じです。
foreach ($users as $user)
で1人ずつ取り出して、
$user['name']
を表示しています。
結果は、
・みのり
・田中
・佐藤
のようになります。
6.endforeachって何?
先ほど、
<?php foreach ($users as $user): ?>
という書き方をしました。
最後には、
<?php endforeach; ?>
があります。
これは、
foreach ($users as $user) {
}
と基本的には同じです。
HTMLの中にPHPを書くときは、
foreach (...):
から、
endforeach;
までが繰り返す範囲だと分かりやすいため、この書き方を見かけることがあります。
WordPressのテーマなどを触っていると遭遇する可能性もあります。
AIが、
<?php foreach ($posts as $post): ?>
<h2><?= $post['title'] ?></h2>
<?php endforeach; ?>
と書いてきても、
別のforeachではありません。
書き方が違うだけです。
7.キーも一緒に取り出せる
foreach には、もうひとつよく見る形があります。
foreach ($user as $key => $value) {
echo $key;
echo $value;
}
また => が出てきました。
例えば、
$user = [
'name' => 'みのり',
'age' => 18,
'favorite' => 'ココア'
];
に対して、
foreach ($user as $key => $value) {
echo $key . ':' . $value . '<br>';
}
とすると、
name:みのり
age:18
favorite:ココア
のようになります。
ここでは、
$key
に、
name
age
favorite
が入り、
$value
に、
みのり
18
ココア
が入ります。
つまり、
foreach ($user as $key => $value)
は、
キーと値をセットで1件ずつ取り出している
わけです。
8.$users as $user の名前は決まりなの?
ここもAIが書いたコードを読むときに知っておくと便利です。
foreach ($users as $user)
の $user は、PHPで決められた名前ではありません。
例えば、
foreach ($users as $person) {
echo $person['name'];
}
でも動きます。
極端にいえば、
foreach ($users as $banana) {
echo $banana['name'];
}
でもPHPとしては動きます。
ただし、これは非常に分かりにくいですね。
そのため、
$users → $user
$products → $product
$posts → $post
$items → $item
のように、
複数形 → 単数形
にすることがよくあります。
これを知っているだけでも、AIが生成したコードがかなり読みやすくなります。
9.データベースでforeachが大量に登場する理由
PHPでデータベースから商品一覧を取得したとします。
例えば、
$products = [
[
'name' => '商品A',
'price' => 1000
],
[
'name' => '商品B',
'price' => 2000
],
[
'name' => '商品C',
'price' => 3000
]
];
商品が何件あるかは、状況によって変わるかもしれません。
3件かもしれない。
10件かもしれない。
100件かもしれない。
そこで、
foreach ($products as $product) {
echo $product['name'];
}
とします。
これなら商品数が変わっても、基本的に同じコードで処理できます。
だから実際のWeb制作では foreach が頻繁に登場するのです。
10.AIが書いたコードを読んでみよう
AIがこんなコードを書いたとします。
foreach ($products as $product) {
echo '<h2>' . $product['name'] . '</h2>';
echo '<p>' . $product['price'] . '円</p>';
}
以前なら、
「foreach……as……なんだこれ?」
だったかもしれません。
でも、もう分解できます。
$products
↓
商品一覧
as $product
↓
商品を1件取り出す
$product['name']
↓
その商品の名前
$product['price']
↓
その商品の価格
つまり、
「商品を1件ずつ取り出して、名前と価格を表示している」
だけです。
全部を自分で書けなくても、
何をしているコードなのかは読める。
これが今回の目標です。
11.foreachでよくある「あれ?表示されない」
例えば、
$users = [];
という空の配列だったとします。
そして、
foreach ($users as $user) {
echo $user['name'];
}
を実行します。
この場合、表示される名前はありません。
なぜなら、
そもそも取り出すデータが0件だから
です。
foreach が壊れているとは限りません。
こんなときは、
var_dump($users);
や、
print_r($users);
で、中身を確認してみましょう。
前回の記事で覚えた方法が、ここでも使えます。
12.AIに聞くときも「foreachがおかしい」だけで終わらせない
例えば、一覧が表示されない場合、
foreachが動きません。
だけでもAIに相談できます。
でも、もう少し情報を渡せます。
例えば、
$usersをforeachで処理していますが、何も表示されません。var_dump($users)の結果は空配列でした。
foreachより前のデータ取得処理に問題がないか確認してください。
ここまで伝えられれば、AIも原因を絞り込みやすくなります。
コードを少し読めるだけで、AIへの質問の質も上がる。
PHPを学ぶメリットは、ここにもあります。
今日の合格ライン
今回覚えておきたいのは、この5つです。
foreachは配列を順番に処理する$users as $userは「usersから1件ずつuserとして取り出す」- 配列の件数が増えても基本的なコードは変わらない
$key => $valueならキーと値の両方を取り出せる- 何も表示されないときは、元の配列が空ではないか確認する
特に、
foreach ($users as $user)
を見て、
「usersを1件ずつuserとして処理している」
と読めれば、今回は合格です。
ワンポイント答え合わせ
次のコードを見てみましょう。
$colors = [
'赤',
'青',
'黄色'
];
foreach ($colors as $color) {
echo $color;
}
何が表示されるでしょう?
A. 赤だけ
B. 黄色だけ
C. 赤・青・黄色
正解は、
C. 赤・青・黄色
です。
$colors の中身を1件ずつ $color に入れて処理しています。
では、こちらはどうでしょう。
foreach ($products as $product) {
echo $product['name'];
}
これは、
「productsの中の商品を1件ずつ取り出して、それぞれのnameを表示している」
と読めます。
ここまで読めれば十分です。
AI時代だからこそ、磨こう。その腕。
AIなら foreach を使ったコードを一瞬で作ってくれます。
100件の商品一覧を表示するコードも、データベースから取得したユーザーを並べるコードも作れます。
だから、
foreachを何も見ずに完璧に書けること
だけを目標にする必要はありません。
それよりも、
foreach ($users as $user)
を見たとき、
「あ、複数のデータを1件ずつ処理しているんだな」
と分かること。
そして、動かなかったときに、
「foreachが悪いのか? それとも元の配列が空なのか?」
と考えられること。
その力があれば、AIが書いたPHPを扱いやすくなります。
1から全部書く必要はない。
だが、知る必要はある。
次は foreach と一緒によく登場する、
「ifって結局どう読む?」PHPの条件分岐を使って「○○なら表示する」を理解しよう
に進むと、配列 → foreach → if がつながり、実際の一覧画面でよく見るPHPがかなり読めるようになります。
