【PHP/演習問題】continue文[2]

【PHP/演習問題】continue文[2]

問題

次の実行例になるような複数商品の合計料金を出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 商品の料金は『単価×個数』とする
  • 商品名、単価、個数は標準入力で入力する
  • 商品名が空入力の場合、その商品入力をスキップする
    ※ 空入力 = 何も入力せずにEnterキーを押す
  • 単価、個数の入力値は整数型(interger)にキャストする
  • 商品入力の最後に継続可否を入力し、Yの場合は次の商品入力処理、Nの場合は終了する
$ php practice.php
<<<< 商品入力 >>>>
商品名 > 炭酸水
単価  > 150
個数  > 2
続けますか?(Y/N)> Y
商品名 > 
商品名 > 
商品名 > 弁当
単価  > 560
個数  > 2
続けますか?(Y/N)> Y
商品名 > お菓子
単価  > 300
個数  > 7
続けますか?(Y/N)> N

<<<<  会計  >>>>
---- 合計料金 ----
3520
----  明細  ----
商品名 : 炭酸水
単価  : 150
個数  : 2
.................
商品名 : 弁当
単価  : 560
個数  : 2
.................
商品名 : お菓子
単価  : 300
個数  : 7
.................
$ php practice.php
<<<< 商品入力 >>>>
商品名 > ローストビーフ
単価  > 1500
個数  > 2
続けますか?(Y/N)> y
続けますか?(Y/N)> x
続けますか?(Y/N)> a
続けますか?(Y/N)> Y
商品名 > ワイン
単価  > 500
個数  > 4
続けますか?(Y/N)> Y
商品名 > 牡蠣
単価  > 600
個数  > 8
続けますか?(Y/N)> n
続けますか?(Y/N)> x
続けますか?(Y/N)> N

<<<<  会計  >>>>
---- 合計料金 ----
9800
----  明細  ----
商品名 : ローストビーフ
単価  : 1500
個数  : 2
.................
商品名 : ワイン
単価  : 500
個数  : 4
.................
商品名 : 牡蠣
単価  : 600
個数  : 8
.................

解答例

<?php

$items = [];

$total = 0;

echo "<<<< 商品入力 >>>>\n";
while( true ) {
    
    echo "商品名 > ";
    $name = trim(fgets(STDIN));
    if( $name == '' ) {
        continue;
    }
    
    echo "単価  > ";
    $price = trim(fgets(STDIN));
    $price = (int)$price;
    
    echo "個数  > ";
    $unit = trim(fgets(STDIN));
    $unit = (int)$unit;
    
    $items[] = [ 'name'=>$name, 'price'=>$price, 'unit'=>$unit ];
    
    $total += $price * $unit;
    
    $next = '';
    while( $next != 'Y' && $next != 'N') {
        echo "続けますか?(Y/N)> ";
        $next = trim(fgets(STDIN));
    }
    if( $next == 'N' ) {
        break;
    }
}

echo "\n";
echo "<<<<  会計  >>>>\n";
echo "---- 合計料金 ----\n";
echo $total."\n";
echo "----  明細  ----\n";
foreach( $items as $item ) {
    echo "商品名 : ".$item['name']."\n";;
    echo "単価  : ".$item['price']."\n";
    echo "個数  : ".$item['unit']."\n";;
    echo ".................\n";
}

?>