テクノロジー

2023年2月2日

配列を使ってプログラムを改修しよう

配列を使って掲示板アプリケーションの改修を完了させる

プログラムの改修点を確認しよう

前回までのコードに配列を使って、それまでに入力された過去のデータもすべて表示できるように改修していきましょう。

要件を確認してみます。

プログラムの要件

  • “1から5で評価を入力してください。終了する場合は「6」を入力してください”と出力する
  • readline で入力された評価ポイント受け取る
  • 数字以外を入力されたら”数字を入力してください”と出力して入力モードに、6が入力されたら”終了します”と出力してプログラムを終了する
  • readline で入力されたコメントを受け取る
  • 過去の評価ポイントとコメントを”ポイント:○ コメント:○○○”と言う形で全件出力する(プログラムが終了した時点でデータは消えます)
  • 1に戻る

今回改修するのは 5 の部分です。
前回までのコードは以下の通りです。

[sample.php]

<?php
 
while (true) {
    $point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));

    if ($point === 6) {
        echo '終了します' . PHP_EOL;
        break;
    } elseif ($point !== 0) {
        $comment = readline('コメントを入力してください' . PHP_EOL);
        echo "あなたのポイント: $point" . PHP_EOL;
        echo "あなたのコメント: $comment" . PHP_EOL;
    } else {
        echo '数字を入力してください' . PHP_EOL;
    }
}

このコードの下記の部分を書き換えていきましょう。

echo "あなたのポイント: $point" . PHP_EOL;
echo "あなたのコメント: $comment" . PHP_EOL;

どこでどのデータ型を使うのが良いのかを考えて改修しよう

過去の評価ポイントとコメントをすべて表示させるには、以下のことを考える必要があります。

  1. どのような形式で入力したデータを保持するか
  2. どのような方法で過去の入力データを管理するか

どのような形式で入力したデータを保持するかを考えよう

入力するデータがポイントとコメントの2つ存在するため、複数のデータが保持できる配列が候補になります。
それぞれのデータの意味(ポイントのデータ、コメントのデータ)がわかるようにしたいです。そのため、データを番号ではなく特定の名前(キー)をつけて保持できる配列を使い、入力したデータを保持することにします。

[保持するデータのイメージ]

[
    ポイントのキー => ポイントの値,
    コメントのキー => コメントの値,
];

[実際のコード]

$post = [
    'point'   => $point,
    'comment' => $comment,
];

入力された値が入った $point 変数と $comment 変数を使って配列を作り、$post という変数に格納しました(変数名は $post である必要はありませんが、この先もこの変数を使用していきます)。

どのような方法で過去の入力データを管理するかを考えよう

プログラムが終了するまで値を保持し続けるにはどうすればよいでしょうか。
過去の入力したデータ(当時の $post 変数の情報)をすべて表示できるようにするため、複数のデータが管理できる配列が候補になります。

[管理するデータのイメージ]

[
    1回目のデータ[1回目の$post変数],
    2回目のデータ[2回目の$post変数],
    :
    :
];

ここでは複数のデータを番号で管理できれば良いので、配列を使って過去に入力したデータを保持することにします。

[実際のコード]

$posts = []; // --(1)
$post = [
    'point'   => $point,
    'comment' => $comment,
]; // --(2)
array_push($posts, $post) // --(3)
  • はじめに $posts = []; として全データを格納するための配列をあらかじめ作っておきます(変数名は $posts である必要はありませんが、この先もこの変数を使用していきます)。
  • 入力された値が入った $point 変数と $comment 変数を使って配列を作り、$post という変数に格納します。
  • 1で作った $posts$post を追加しています。while でループが一つ進むたびに$posts に要素が追加されていきます。

これで、readline で受け取ったデータをプログラムが終了するまで値を保持し続けることができます。

では実際にプログラムを書き換えてみましょう。

解答コード

[sample.php]

<?php

$posts = [];
while (true) {
    $point = intval(readline('1から5の数字で評価を入力してください。終了する場合は「6」を入力してください' . PHP_EOL));
    if ($point === 6) {
        echo '終了します' . PHP_EOL;
        break;
    } elseif ($point !== 0) {
        $comment = readline('コメントを入力してください' . PHP_EOL);
        $post = [
            'point'  => $point,
            'comment'=> $comment,
        ];
        array_push($posts, $post);
        foreach ($posts as $post) {
            $point = $post['point'];
            $comment = $post['comment'];
            echo "ポイント: $point コメント: $comment" . PHP_EOL;
        }
    } else {
        echo '数字を入力してください' . PHP_EOL;
    }
}

$posts = []; をループの中に記述してしまうと、なんども空の配列が作られてしまうため、while の処理が始まる前に定義しておくことが必要です。
実際にプログラムを実行し、要件通りに動作するか確認してみてください。

まとめ

評価ポイントとコメントを配列 $post にし、その配列 $postを配列 postsの要素にすることで改修できる。

ダイビックのことをもっと知ってみませんか?