16. 配列の繰り返し

for文で繰り返し

配列の個数と範囲指定

配列をfor文 で繰り返します。西暦の配列データをビルトイン関数 count()range() を使って処理してみましょう。

$years = [2020, 2019, 2018, 2017];

count()

count() は配列に入っているデータ個数を取得します。

count(配列);

$years のデータ個数を count() で取得をします。

count($years); //4

range()

$years = [2020, 2019, 2018, 2017];

この配列は range() を使った範囲指定で作成できます。結果を確認したら、var_dump() の行はコメントアウトしてください。

$years = range(2020, 2017);
var_dump($years);

for文でHTML表示

$yearsfor文で繰り返してHTML表示してみましょう。配列の個数をインデックス(キー)の最大数としてループします。

<?php
$years = range(2020, 2017);
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>年</h2>
    <?php
    for ($i = 0; $i < count($years); $i++) {
        echo $years[$i];
        echo "年<br>";
    }
    ?>
</body>
</html>

foreach 文

for 文による配列のループ処理は、count() を使うなどあまり効率的な処理ではありません。 そこで PHP では foreach 文で配列をループさせることもできます。

foreach (配列 as 一時変数) {
    処理;
}

配列データの中身を表示

foreach で年を順番に表示してみましょう。

foreach ($years as $year) {
    echo "{$year}年";
    echo "<br>";
}

endforeach 文

forforeachでHTMLタグを echo 出力しましたが、処理が複雑になるとわかりづらくなります。そこでPHPでは endforendforeach の構文を使うとループ部分のHTMLを直接記述することができます。

endfor の場合

for ではじまり :(コロン) で区切ります。HTMLを記述したら endfor で終わります。

<?php for (繰り返し設定): ?>
HTML
<?php endfor ?>

endforeach の場合

foreach ではじまり :(コロン) で区切ります。HTMLを記述したら endforeach で終わります。

<?php foreach (繰り返し設定): ?>
HTML
<?php endforeach ?>

endforeach でHTML出力

$drinksのデータを endforeachでループし、li タグを出力した例です。

<?php
$years = range(2020, 2017);
$drinks = ['コーヒー', '紅茶', 'ほうじ茶'];
?>
...
<h2>ドリンクメニュー</h2>
<ul>
<?php foreach ($drinks as $drink) : ?>
    <li><?= $drink ?></li>
<?php endforeach ?>
</ul>
結果
ドリンクメニュー
・コーヒー
・紅茶
・ほうじ茶

連想配列をループ処理する

foreach文では連想配列のキーと値を同時に処理できます。

foreach (連想配列 as キー => 値) {
    処理;
}

連想配列のキーと値を表示

連想配列 $user のデータを作成して、foreachでキーと値をHTML表示してみましょう。

<?php
$user = [
    'name' => '東京 一郎',
    'gender' => 'male',
    'age' => 21,
];
?>

...
    <h2>ユーザデータ</h2>
    <dl>
        <?php foreach ($user as $key => $value) : ?>
            <dt><?= $key ?></dt>
            <dd><?= $value ?></dd>
        <?php endforeach ?>
    </dl>
...
結果
name
東京 一郎
gender
male
age
21

プルダウン表示

HTMLのプルダウンはselectoptionで作成できます。

<select name="year">
   <option value="2020">2020年</option>
   <option value="2019">2019年</option>
   <option value="2018">2018年</option>
   <option value="2017">2017年</option>
</select>

endforeach でプルダウン表示

今年から1900年のプルダウンを作成してみましょう。date('Y') で今年を取得して1900までの配列を range() で作成します。

<?php
...
$years = range(date('Y'), 1900);
...
?>

...
    <h2>プルダウン</h2>
    <select name="year">
        <?php foreach ($years as $year) : ?>
            <option value="<?= $year ?>"><?= $year ?>年</option>
        <?php endforeach ?>
    </select>
...

ファイルを検索する glob() 関数

glob() を使うと、指定したフォルダのファイルを検索することができます。例えば現在のフォルダ(実行するPHPファイル)にのすべてのファイルを検索するには ./* を指定します。 ここでも *(アスタリスク)は全てを意味します。

foreach (glob("./*") as $file) {
    $all_files[] = $file;
}

現在のフォルダの .php ファイルだけを検索したいときは ./*.php と指定します。

foreach (glob("./*.php") as $file) {
    $php_files[] = $file;
}
HTML部分
...
    <h2>ファイルリスト</h2>
    <ul>
        <?php foreach ($all_files as $file) : ?>
            <li><?= $file ?></li>
        <?php endforeach ?>
    </ul>

    <h2>ファイルリスト(PHP)</h2>
    <ul>
        <?php foreach ($php_files as $file) : ?>
            <li><?= $file ?></li>
        <?php endforeach ?>
    </ul>
...

問題1

以下の商品の配列データを作成し HTML で表示してみましょう。また、is_sale = true のときは「セール」と表示してみましょう。

id name price is_sale
1 コーヒー 120 true
2 紅茶 150 false
3 ほうじ茶 130 true
4 炭酸水 80 true
5 オレンジジュース 150 false

問題2

問題1の商品データを以下の個数で買った時の
合計金額を計算してみましょう。

ID 個数
1 8
2 3
3 6
4 0
5 7

PHP超入門