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

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

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

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

3回答

588閲覧

PHPのループ文の使い方

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2018/03/15 05:29

編集2018/03/19 04:46

前提・実現したいこと

入力画面と確認画面があります。
入力はドロップダウンリストとテキストボックスが入り混じっています。
テキストボックスには数値を入れて、最終的に合計を確認画面で確認できるようにしております。

その際
・入力行の作成をループで作成し、任意の行数を入れたい。
・行それぞれの変数をループで取得できるようにしたい。
・確認画面でもPOST(又はGET)の取得をループで取得できるようにしたい。

という部分においてうまくいっておりません。

ご助力お願い致します。

入力画面↓

php

1<head> 2 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 3</head> 4 5<body> 6 <form action="kakunin.php" name="form" method="post"> 7 <table> 8 <tr> 9 <td> 10 <select name="transport1"> 11 <?php 12 $traline1 = array('-' => '0','地下鉄' => '地下鉄','JR在来線' => 'JR在来線','JR新幹線' => 'JR新幹線','阪急' => '阪急','京阪' => '京阪'); 13 foreach($traline1 as $k => $v) { 14 print("<option value='$k'>$k</option>"); 15 } 16 ?> 17 </select> 18 </td> 19 <td> 20 <input type="text" name="price1a"> 21 </td> 22 <td> 23 <select name="division1"> 24 <?php 25 $divline1 = array('-' => '0','片道' => '1','往復' => '2'); 26 foreach($divline1 as $k => $v) { 27// print sprintf("<option value='%s'>%s</option>\n", $k ,$v);//文字列表現 28 print("<option value='$k'>$k</option>"); 29 } 30 ?> 31 </select> 32 </td> 33 <td> 34 <input disabled type="text" name="total1a" value="0"> 35 </td> 36 </tr> 37 <tr> 38 <td> 39 <select name="transport2"> 40 <?php 41 $traline2 = array('-' => '0','地下鉄' => '地下鉄','JR在来線' => 'JR在来線','JR新幹線' => 'JR新幹線','阪急' => '阪急','京阪' => '京阪'); 42 foreach($traline2 as $k => $v) { 43 print("<option value='$k'>$k</option>"); 44 } 45 ?> 46 </select> 47 </td> 48 <td> 49 <input type="text" name="price2a"> 50 </td> 51 <td> 52 <select name="division2"> 53 <?php 54 $divline2 = array('-' => '0','片道' => '1','往復' => '2'); 55 foreach($divline2 as $k => $v) { 56// print sprintf("<option value='%s'>%s</option>\n", $k ,$v);//文字列表現 57 print("<option value='$k'>$k</option>"); 58 } 59 ?> 60 </select> 61 </td> 62 <td> 63 <input disabled type="text" name="total2a" value="0"> 64 </td> 65 </tr> 66 <tr> 67 <td> 68 <select name="transport3"> 69 <?php 70 $traline3 = array('-' => '0','地下鉄' => '地下鉄','JR在来線' => 'JR在来線','JR新幹線' => 'JR新幹線','阪急' => '阪急','京阪' => '京阪'); 71 foreach($traline3 as $k => $v) { 72 print("<option value='$k'>$k</option>"); 73 } 74 ?> 75 </select> 76 </td> 77 <td> 78 <input type="text" name="price3a"> 79 </td> 80 <td> 81 <select name="division3"> 82 <?php 83 $divline3 = array('-' => '0','片道' => '1','往復' => '2'); 84 foreach($divline3 as $k => $v) { 85// print sprintf("<option value='%s'>%s</option>\n", $k ,$v);//文字列表現 86 print("<option value='$k'>$k</option>"); 87 } 88 ?> 89 </select> 90 </td> 91 <td> 92 <input disabled type="text" name="total3a" value="0"> 93 </td> 94 </tr> 95 </table> 96 <input type="submit" value="確認" class="btn"> 97 </form> 98</body>

確認画面↓

php

1<body> 2<h1>出張旅費確認画面</h1> 3<table> 4<?php 5header('Content-Type: text/html; charset=UTF-8'); 6error_reporting(E_ALL & ~E_NOTICE); 7for($i=1;$i<=3;$i++){ 8$tra[$i]=$_POST['transport'$i]; 9$pri[$i]a=$_POST['price'$i'a']; 10$div[$i]=$_POST['division'$i]; 11$total[$i]a = $pri[$i]a; 12} 13if($_POST[Submit]){ 14for($i=0;$i<=5;$i++){ 15 if($_POST["tra".$i]=="0" || $_POST["pri".$i."a"]=='' || $_POST["div".$i]=='0')){ 16 $trim = trim($total1a); 17 } 18 else{ 19 $_POST["total".$i."a"] = $_POST["pri".$i."a"]; 20 print'<tr>'; 21 print'<td>交通機関:'; 22 print$_POST["tra".$i]; 23 print'</td>'; 24 print'<td>単価:'; 25 print$_POST["pri".$i."a"]; 26 print'</td>'; 27 print'<td>区間:'; 28 print$_POST["div".$i]; 29 print'</td>'; 30 print'<td>合計:'; 31 print$_POST["total".$i."a"]; 32 print'円</td>'; 33 print'</tr>'; 34 } 35} 36?> 37</table> 38</body>

試したこと

確認画面を以下のようにすれば当然表示はされますが、
冗長的になってしまっている部分をループを使って簡潔にしたいです。

php

1<body> 2<table> 3<?php 4header('Content-Type: text/html; charset=UTF-8'); 5error_reporting(E_ALL & ~E_NOTICE); 6$tra1=$_POST['transport1']; 7$tra2=$_POST['transport2']; 8$tra3=$_POST['transport3']; 9$pri1a=$_POST['price1a']; 10$pri2a=$_POST['price2a']; 11$pri3a=$_POST['price3a']; 12$div1=$_POST['division1']; 13$div2=$_POST['division2']; 14$div3=$_POST['division3']; 15$total1a = $pri1a; 16$total2a = $pri2a; 17$total3a = $pri3a; 18$totala = $total1a + $total2a + $total3a 19 20if($tra1=='0' || $pri1a=='' || $div1=='0'){ 21 $trim = trim($total1a); 22} 23else{ 24 print'<tr><td>交通機関:'; 25 print$tra1; 26 print'</td><td>単価:'; 27 print$pri1a; 28 print'</td><td>区間:'; 29 print$div1; 30 print'</td><td>合計:'; 31 print$total1a; 32 print'円</td></tr>'; 33} 34if($tra2=='0' || $pri2a=='' || $div2=='0'){ 35 $trim = trim($total2a); 36} 37else{ 38 print'<tr><td>交通機関:'; 39 print$tra2; 40 print'</td><td>単価:'; 41 print$pri2a; 42 print'</td><td>区間:'; 43 print$div2; 44 print'</td><td>合計:'; 45 print$total2a; 46 print'円</td></tr>'; 47} 48if($tra3=='0' || $pri3a=='' || $div3=='0'){ 49 $trim = trim($total3a); 50} 51else{ 52 print'<tr><td>交通機関:'; 53 print$tra3; 54 print'</td><td>単価:'; 55 print$pri3a; 56 print'</td><td>区間:'; 57 print$div3; 58 print'</td><td>合計:'; 59 print$total3a; 60 print'円</td></tr>'; 61} 62?> 63</table> 64</body>

補足情報(FW/ツールのバージョンなど)

XAMPP、apache、クロームで動かしています。

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

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

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

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

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

m.ts10806

2018/03/15 05:40

インデントをなるべく適切につけてください。関数やif文などの最初と終わり、中がどこまでなのかなどコードが読みづらくなります。
m.ts10806

2018/03/15 05:43

要は、入力した内容を次の画面で表示したい(合計などは別途計算)ということですよね?
退会済みユーザー

退会済みユーザー

2018/03/15 05:52

インデントの指摘ありがとうございます、質問が分かりづらくて申し訳ありません。ボタンを押して次のページでの計算と表示はできているのですが、入力できる行を増やした時に、コードの量も大変多くなり、可読性も悪くなってしまったので、ループを適用したいのですが、本を読んだりいろいろなブログを参考にしてもうまくいかなかったので、この場合のループによる行の追加を入力画面、確認画面ともに教えていただきたく質問させていただきました。
m.ts10806

2018/03/15 05:58

行の追加は「その他」の項目のところですかね。「追加」ボタンを押してHTMLを作るのと、最初から行数が決まっているのとどちらでしょうか。
退会済みユーザー

退会済みユーザー

2018/03/15 06:02

最初から行数を決め打ちして、編集時はコードを操作する形にしようと思っております。
m.ts10806

2018/03/15 06:04

なるほど、それなら割とやりやすいかもしれません。ヒント的なところで回答します。
退会済みユーザー

退会済みユーザー

2018/03/15 06:12

質問の意味を遅れて理解してしまい回答が遅れた部分がございます、「その他」以外の部分もループで決め打ちした数だけ増やそうと思っております。実際それぞれ5行ずつコードを書いていたのですが、ものすごく大変で、しかもそのまま質問に載せられないくらい長くなってしまいました。
m.ts10806

2018/03/15 06:15

ありがとうございます。おおよそ理解しました。
guest

回答3

0

今回の質問の趣旨からすると冗長部分をプログラム化したいとの事なので簡易的なサンプルまで。

PHP

1 〜〜〜〜 2 <td><select name="transport1"> 3 <?php 4 $line = array('0' => '-','地下鉄' => '地下鉄','JR在来線' => 'JR在来線','JR新幹線' => 'JR新幹線','阪急' => '阪急','京阪' => '京阪'); 5 foreach($line as $k => $v) { 6 print sprintf("<option value='%s'>%s</option>\n", $k ,$v); 7 } 8 ?> 9 </select></td> 10 <td> 11 〜〜〜〜

mts10806さんの仰るとおり「ちょっとフレームワークちっくなものになりそうですし」に尽きます。
フレームワークに頼るより一旦自前で一通りの処理を書いて理解する方が先々良いかと思います。

ループ処理よりもっと色々留意する所があります。

・セッション処理とか
・HTTPのステートレス特性による戻るボタン問題とか
・サニタイズ処理とか
etc

※今は意識しなくてもいずれ突き当たりますので、その際に参考にして頂ければと思います。
(消化不良になるので敢えて説明しません。今は無視して下さい)

入力処理は色々なエッセンスが含まれてますので頑張って会得して下さい。

投稿2018/03/15 07:17

編集2018/03/15 07:19
HS1111

総合スコア91

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

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

退会済みユーザー

退会済みユーザー

2018/03/19 04:28

サンプルありがとうございます。 あれから自分でも調べ、試行錯誤して何とか完成させたかったのですが、 また少し分からない部分がございます。 問題の部分を抜き出して質問用にしてみたので アドバイスなどいただけますでしょうか? ↓入力画面↓ ```php <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form action="kakunin.php" name="form" method="post"> <table> <tr> <td> <select name="transport1"> <?php $traline1 = array('-' => '0','地下鉄' => '地下鉄','JR在来線' => 'JR在来線','JR新幹線' => 'JR新幹線','阪急' => '阪急','京阪' => '京阪'); foreach($traline1 as $k => $v) { print("<option value='$k'>$k</option>"); } ?> </select> </td> <td> <input type="text" name="price1a"> </td> <td> <select name="division1"> <?php $divline1 = array('-' => '0','片道' => '1','往復' => '2'); foreach($divline1 as $k => $v) { // print sprintf("<option value='%s'>%s</option>\n", $k ,$v);//文字列表現 print("<option value='$k'>$k</option>"); } ?> </select> </td> <td> <input disabled type="text" name="total1a" value="0"> </td> </tr> <tr> <td> <select name="transport2"> <?php $traline2 = array('-' => '0','地下鉄' => '地下鉄','JR在来線' => 'JR在来線','JR新幹線' => 'JR新幹線','阪急' => '阪急','京阪' => '京阪'); foreach($traline2 as $k => $v) { print("<option value='$k'>$k</option>"); } ?> </select> </td> <td> <input type="text" name="price2a"> </td> <td> <select name="division2"> <?php $divline2 = array('-' => '0','片道' => '1','往復' => '2'); foreach($divline2 as $k => $v) { // print sprintf("<option value='%s'>%s</option>\n", $k ,$v);//文字列表現 print("<option value='$k'>$k</option>"); } ?> </select> </td> <td> <input disabled type="text" name="total2a" value="0"> </td> </tr> <tr> <td> <select name="transport3"> <?php $traline3 = array('-' => '0','地下鉄' => '地下鉄','JR在来線' => 'JR在来線','JR新幹線' => 'JR新幹線','阪急' => '阪急','京阪' => '京阪'); foreach($traline3 as $k => $v) { print("<option value='$k'>$k</option>"); } ?> </select> </td> <td> <input type="text" name="price3a"> </td> <td> <select name="division3"> <?php $divline3 = array('-' => '0','片道' => '1','往復' => '2'); foreach($divline3 as $k => $v) { // print sprintf("<option value='%s'>%s</option>\n", $k ,$v);//文字列表現 print("<option value='$k'>$k</option>"); } ?> </select> </td> <td> <input disabled type="text" name="total3a" value="0"> </td> </tr> </table> <input type="submit" value="確認" class="btn"> </form> </body> ``` ↓確認画面↓ ```php <body> <h1>出張旅費確認画面</h1> <table> <?php header('Content-Type: text/html; charset=UTF-8'); error_reporting(E_ALL & ~E_NOTICE); for($i=1;$i<=3;$i++){ $tra[$i]=$_POST['transport'$i]; $pri[$i]a=$_POST['price'$i'a']; $div[$i]=$_POST['division'$i]; $total[$i]a = $pri[$i]a; } if($_POST[Submit]){ for($i=0;$i<=5;$i++){ if($_POST["tra".$i]=="0" || $_POST["pri".$i."a"]=='' || $_POST["div".$i]=='0')){ $trim = trim($total1a); } else{ $_POST["total".$i."a"] = $_POST["pri".$i."a"]; print'<tr>'; print'<td>交通機関:'; print$_POST["tra".$i]; print'</td>'; print'<td>単価:'; print$_POST["pri".$i."a"]; print'</td>'; print'<td>区間:'; print$_POST["div".$i]; print'</td>'; print'<td>合計:'; print$_POST["total".$i."a"]; print'円</td>'; print'</tr>'; } } ?> </table> </body> ``` ドロップダウンのループ構造については 理解できる範囲に置き換えていたりします。 入力画面においてとりあえず3つ決め打ちで作ったとして、 確認画面でPOST取得を簡易的にループで行ったり、 表示をfor文で一気に3つ作成したいと思い 上記のようなコードにしてみたのですが、 上手くいきません。 入力画面も3つ決め打ちのような形ではなく、 for(i=1;i>x;i++){ のxの数だけ<tr>を複製できるようなコードが望ましくはありますが、 こちらも上手くいっておりません。
HS1111

2018/03/21 01:09

どの様な点が想定外の動作をしますか? 具体的にして頂ければ的確な回答を得られますよ。 斜め読みレベルで気になった点、下記の配列参照の際の添字の作成変じゃないすか?! $tra[$i]=$_POST['transport'$i]; $pri[$i]a=$_POST['price'$i'a']; $div[$i]=$_POST['division'$i];
guest

0

HTMLの生成をPHP側で行うか、JSONで配列をセットしてJavaScriptでループさせるかですかね。

PHP側で行う場合は、テンプレートエンジンを使うか素で書くかは各々異なると思います。
最近はJavaScript側での処理が一般的になってますでしょうか。

どの方法を採用するかで書き方が変わってきますので一旦頭出しまで。

投稿2018/03/15 05:39

HS1111

総合スコア91

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

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

退会済みユーザー

退会済みユーザー

2018/03/15 05:47

JSも考えてみます。 ありがとうございます。
HS1111

2018/03/15 06:03

POST後のvalidationはPHP側で処理してHTMLを生成していますね。 それならレベルを合わせて、入力フォーム生成もPHPで行った方がよいかと思いました。 初期入力画面表示なのかsubmitされた後なのかを$_SERVER['REQUEST_METHOD']の値とかで判定すると分岐させる事が出来ますし一つの処理として扱う方が良いと思います。 ページルーティングとか言い始めると難しくなるので、今は入力画面の生成をPHPにする方法で考えたら如何でしょうか?
退会済みユーザー

退会済みユーザー

2018/03/15 06:16

方法だけでもたくさんあることに驚きました。 現在入力画面をHTML、確認画面をphpとしていますが、 入力画面にHTMLとphpを使うという事で間違い無いでしょうか?
HS1111

2018/03/15 06:31

> 方法だけでもたくさんあることに驚きました。 大別すると、サーバー側の処理なのか、クライアント側(ブラウザー)で処理させるのかの違いです。 >入力画面にHTMLとphpを使うという事で間違い無いでしょうか? はい、そうです。 その場合拡張子は.phpにするべきです。(設定によりますが) HTMLの可変部分をPHPで書く事になります。 本件では<option>タグをprint文で生成するループですね。 頑張って下さい。
m.ts10806

2018/03/15 06:39

サンプルコード的なものを提示して回答としようと思っていましたが、 HS1111さんのコメントをヒントに質問者さんが自身で頑張った方が良さそうですね。(ちょっとフレームワークちっくなものになりそうですし)
guest

0

確認させてください

1.
入力行の作成をループで作成し、任意の行数を入れたい。
Q:
最初に何件か入れてから件数分画面を出して入力でいいですか?
それとも10件くらいの入力がループであり、それ以内の任意件数
処理すればいいのですか?

2.
・行それぞれの変数をループで取得できるようにしたい。
A:
ループでとるなら、すべての変数(name='abc'->name='abc[]')
を配列にっすれば件数分とれます、また空をスキップすれば
任意件数処理できます。

3.
・確認画面でもPOST(又はGET)の取得をループで取得できるようにしたい。
Q:
エクセルのように、一件ずつ POSTしたいのですか
それともまとめて POSTいいですか?

これらの仕様がわかれば ソースをかけます。

概略
<fotm --->
loop開始
<input name='a[]' type='text' ......>
<input name='b[]' type='text' ......>
セレクトなどは name='c[][]'
<submit 文 naem='s1,s2,s3'のような配列行のわかる変数>  <-1行 POST
loop
<submit 文>  <-まとめて POST

</form>

投稿2018/03/25 23:36

GBB00516

総合スコア29

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問