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

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

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

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

Q&A

解決済

3回答

6491閲覧

2回目以降にpostしたときにphpの処理ができない(ハノイの塔)

Pccla

総合スコア35

PHP

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

0グッド

0クリップ

投稿2017/02/26 17:34

編集2017/02/26 17:41

PHPの勉強がてら、ハノイの塔を作っています。

・3列のハノイの塔($box1,$box2,$box3)

// 初期値を設定 $box1 = array(5,4,3,2,1); $box2 = array(); $box3 = array();

・「右へ移動」ボタンを押せば、初期値の配列の先頭の値が1つpostされ、$box2 に移動する。

// この状態になる $box1 = array(4,3,2,1) $box2 = array(5)

###【ここからはまってます!】
・連続してpost(「右へ移動」ボタンをクリック)したときに、
配列の先頭の値が移動してくれません。
PHP, HTMLの何が理解できていないのかヒントを頂けると幸いです。

// 連続でpostしたときに↓のようになって欲しい $box1 = array(3,2,1) $box2 = array(4,5)

lang

1<html> 2<table> 3<tr> 4 <td class="box"> 5 <form action="index.php" method="post"> 6 <input type="submit" name="box1" value="右に移動"> 7 </form> 8 </td> 9 <td class="box"> 10 <form action="index.php" method="post"> 11 <input type="submit" name="box2_left" value="左に移動"> 12 <input type="submit" name="box2_right" value="右に移動"> 13 </form> 14 </td> 15 <td class="box"> 16 <form action="index.php" method="post"> 17 <input type="submit" name="box3" value="左に移動"> 18 </form> 19 </td> 20</tr> 21</table> 22</html> 23 24<?php $box1 = array(1,2,3,4,5); ?> 25<?php $box2 = array(); ?> 26<?php $box3 = array(); ?> 27 28<?php if (isset($_POST["box1"])): ?> 29 <?php $box_take = array_shift($box1); ?> 30 <?php array_unshift($box2, $box_take); ?> 31 <table> 32 <tr> 33 <td class='box'> 34 <?php foreach ($box1 as $box1_result): ?> 35 <?php echo $box1_result."<br>"; ?> 36 <?php endforeach; ?> 37 </td> 38 39 <?php if(isset($box2)): ?> 40 <td class='box'> 41 <?php foreach ((array)$box2 as $box2_result): ?> 42 <?php echo $box2_result."<br>"; ?> 43 <?php endforeach; ?> 44 </td> 45 <?php endif; ?> 46 47 <?php if(isset($box3)): ?> 48 <td class='box'> 49 <?php foreach ((array)$box3 as $box3_result): ?> 50 <?php echo $box3_result."<br>"; ?> 51 <?php endforeach; ?> 52 </td> 53 <?php endif; ?> 54 </tr> 55 </table> 56<?php elseif (isset($_POST["box2_left"])): ?> 57 <?php $box_take = array_shift($box2); ?> 58 <?php array_unshift($box1, $box_take); ?> 59 <?php foreach ($box1 as $box1_result): ?> 60 <?php echo $box1_result."<br>"; ?> 61 <?php endforeach; ?> 62 63 <?php if(isset($box2)): ?> 64 <?php foreach ((array)$box2 as $box2_result): ?> 65 <div class="box"> 66 <?php echo $box2_result."<br>"; ?> 67 </div> 68 <?php endforeach; ?> 69 <?php endif; ?> 70 71(以下略) 72

lang

1.box{ 2 float: left; 3}

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

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

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

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

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

guest

回答3

0

ベストアンサー

POSTで状態と移動量を受け取るか、セッションとかでデータを持っておくとか。

<INPUT type="hidden">-HTMLタグリファレンス】
http://www.htmq.com/html/input_hidden.shtml

【PHPでセッションを使う方法【初心者向け】 | TechAcademyマガジン】
https://techacademy.jp/magazine/4970

投稿2017/02/26 17:45

kei344

総合スコア69364

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

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

raichi

2017/02/27 02:20

このコメントにつけていいのかちょっと迷いましたが補足ですが、 <form> ~ </form> でくくられた間の値しかpostされないので、複数formがある場合、飛ばしたい情報を書き込む必要があるので何行も同じhiddenを書く必要が出てきてしまいます。 javascriptが使えれば、ひとつのformで済むのですが、phpとhtmlのみだとたくさん書く必要が出てきてしまいますので、仕組みを覚えるという意味でもがんばってください。
kei344

2017/02/27 02:35

To: raichiさん 一つにまとめてsubmitのnameで判断するという手もあるかなと思います。 【PHPでPOST時に押されたボタンを判定する | helog - スマートフォンやhtml5+CSS3など新技術に四苦八苦。jQuery、AjaxなどJavaScriptも難しいですね。そんなWebに悩む人のネタ帳です。】 http://helog.jp/php/post-button/
raichi

2017/02/27 02:40

ボタンの情報POSTされてたんですね・・・jQueryのお世話になってばかりなので盲点でした!
Pccla

2017/02/28 15:46

hidden を使って一旦完成しました!繰り返しが多くて570行になりましたが。 全ての回答が参考になったんですが、kei344さんの回答が最も作業が進むきっかけになったので、ベストアンサーにさせていただきます。 ありがとうございました!
guest

0

ヒントというか私の考え方を書いて見ます。

ハノイの塔ルール
①3本の杭と、中央に穴の開いた大きさの異なる複数の円盤から構成される。
②最初はすべての円盤が左端の杭に小さいものが上になるように順に積み重ねられている。
③円盤を一回に一枚ずつどれかの杭に移動させることができるが、小さな円盤の上に大きな円盤を乗せることはできない。
wiki調べ

PHPでやること
A.前画面から送られてきた「どこからどこへ移動した」情報の解析
B.現在の一番上の円盤が、右や左へ移動できるかの判断
C.ルールにより移動できない場合は、エラーを出力
D.エラーの場合は以前の配列を返し、正常の場合は配列を加工して返す
※加工前の配列情報を常に持ちまわる
※javascriptを使わない(phpのみでやる)ので、ルール違反の場合はエラーを表示する

HTMLでやること
a.formを六つ用意して情報を送る($box1右移動、$box1から3へ右移動、$box2左移動、$box2右移動、$box3から1へ左移動、$box3左移動)
b.hiddenですべてのフォームに現在の配列を保持するように設定する
c.エラーがあればメッセージを表示する

さらっと書きなぐったので、抜けや漏れがあるかもですが大体こんな感じだと思いますので、叩き台にでもつかってください。

投稿2017/02/27 02:07

編集2017/02/27 02:12
raichi

総合スコア278

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

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

Pccla

2017/02/28 15:53

何とか完成までいけたんですが、全部で570行になってしまいました... 仕組みはわかったので、次何か作るときはJavaScript等を使って、短く書いてみます! ありがとうございました!
guest

0

PHPの通常の変数はPHPが呼ばれるたびに初期化されるので、$box1~3の値が保持されているわけでありません。
というのが、PHP、HTMLで理解できていないところになります。
対策としては、大きく分けて2つあります。
まずはクライアント(ブラウザ)とサーバー(PHP)間で$box1~3の内容を送りあう。
もう一つはサーバー(PHP)で値を保持するです。
これらの方法はkei344さんが回答してくださっていますので、ここでは割愛します。

投稿2017/02/26 23:52

ttyp03

総合スコア16996

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

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

Pccla

2017/02/28 15:50

ただ post するだけだとやりとりが1回限りで値が保持できないんでしたね。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問