質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

458閲覧

PHPで、表示の際にwhileで繰り返した文の最後の文字"、"を消したい。

ott0000

総合スコア21

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/10/03 17:33

前提

PHPで自動販売機のお釣りを表示する作っていますが、
表示の際にwhileで繰り返し表示した文の最後の文字(、)を消したいです。
ご指摘お願いいたします。

該当のソースコード

PHP

1<?php 2 3$yen = 10000; // 購入金額 4$product = 150; // 商品金額 5 6function calc($yen, $product) { 7 8 9 10 $oturi = $yen-$product; 11 $okane = array(10000,5000,1000,500,100,50,10,5,1,0); 12 13 if($oturi < 0){ 14 echo $yen."円玉で購入した場合、<br>\n".abs($oturi)."円足りません。"; 15 }else{ 16 echo $yen."円札で購入した場合、<br>\n"; 17 $n=0; 18 while($okane[$n] > 0){ 19 if($okane[$n] > 500){ 20 echo $okane[$n]."円札×".floor($oturi / $okane[$n])."枚、"; 21 }else{ 22 echo $okane[$n]."円玉×".floor($oturi / $okane[$n])."枚、"; //←ここの最後に表示される”、”を消したい 23 } 24 $oturi = $oturi % $okane[$n]; 25 $n++; 26 } 27 28 } 29 30?>

HTML

1 2、、、省略 3 4<body> 5 <section> 6 7 <?php 8 9 echo calc($yen, $product); 10 11 ?> 12 </section> 13</body>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

全体的に冗長なつくりなので直すべきところはたくさんありますが
あえてなるべく元ソースをいかすなら
$nが0より大きいときに最初に「、」を出力するとよいでしょう

PHP

1 while($okane[$n] > 0){ 2 echo $n>0?"、":""; 3 if($okane[$n] > 500){ 4 echo $okane[$n]."円札×".floor($oturi / $okane[$n])."枚"; 5 }else{ 6 echo $okane[$n]."円玉×".floor($oturi / $okane[$n])."枚"; 7 } 8 $oturi = $oturi % $okane[$n]; 9 $n++; 10 }

調整版

一応調整版をあげておきます。
10万円硬貨で買い物するなど特殊な例をのぞき1万円をお釣りで返すことは原則ないので除外、また0のお釣りもないので除外。
あとは配列を使って「、」を区切り文字として結合します

PHP

1$yen = 10000; 2$product = 150; 3 4function calc($yen, $product) { 5 $oturi = $yen-$product; 6 $okane = array(5000,1000,500,100,50,10,5,1); 7 if($oturi < 0){ 8 echo -$oturi."円足りません。"; 9 }else{ 10 print implode("、",array_map(function($x) use(&$oturi){ 11 $kind=$x>500?"札":"玉"; 12 $num=intval($oturi/$x); 13 $oturi%=$x; 14 return "{$x}{$kind}×{$num}枚"; 15 },$okane)); 16 } 17} 18calc($yen, $product);

投稿2022/10/04 00:17

編集2022/10/04 01:30
yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ott0000

2022/10/05 06:34

ありがとうございます!私のコード無駄な分が多いですね、、調整版上げていただき本当に勉強になります!まだわからないコードが多いので調べてみます!
guest

0

ベストアンサー

実装観点にすると「消す」ではなく「間のみ出力する(最後だけ出力しない)」ですね。

やり方は幾つかありますが、例えば、while内でechoせず配列に入れ込んでまとめて出力

PHP

1 $out = []; 2 while($okane[$n] > 0){ 3 if($okane[$n] > 500){ 4 $out[] = $okane[$n]."円札×".floor($oturi / $okane[$n])."枚"; 5 }else{ 6 $out[] = $okane[$n]."円玉×".floor($oturi / $okane[$n])."枚"; 7 } 8 $oturi = $oturi % $okane[$n]; 9 $n++; 10 } 11 echo implode("、",$out); 12

「札」と「玉」しか違わないならそこだけ変数にしてもいいんじゃないかな・・・

PHP

1 $digit = "玉"; 2 if($okane[$n] > 500){ 3 $digit = "札"; 4 } 5 $out[] = $okane[$n]."円".$digit."×".floor($oturi / $okane[$n])."枚";

あと中でechoしてて何もreturnしてないなら
呼び出し時のechoいらないですね。

PHP

1#echo calc($yen, $product); 2calc($yen, $product);

投稿2022/10/04 00:16

編集2022/10/04 02:38
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ott0000

2022/10/05 06:39

表示の修正までありがとうございます! 書いていただいたコードでも学ばせていただきます!
m.ts10806

2022/10/05 06:57

自作で関数作る際にも「どこまでの役割を持たせるか」は考えた方が良いと思います。 役割を持たせすぎると汎用性に欠けますし、細分化しすぎても散らかり過ぎるので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問