• ベストアンサー

forループが正しく動作してくれません。アドバイスお願いします。

どうしてもわからずに困っております。 以下に説明と具体的にスクリプトを載せておりますので、 アドバイスを宜しくお願い致します。 単純にユーザーがformのチェックボタンによって送信してきたデータをphpが受け取って、$v_madori1から$v_madori6までの変数を用意します。 php側としては、nullが6個、つまりv_madori1からv_madori6まですべて中身が空っぽの場合だけ、 エラーのhtmlページへ飛ばすという仕組みです。 (ユーザーがhtmlのページでチェックボタンを一つもチェックしなかったらエラーにしたいという考えです。) そこで、for文を使って簡単にエラーをチェックしてみようと思いました。 forループ内の最後のheader関数は、 結局6つともnullだったということなので、 errorページへ飛ばすという意味の関数です。 以下にスクリプトの一部を抜粋して載せました。 間違いをご指摘ください。 宜しくお願い致します。 //間取りの情報受信 $v_madori1 = $_REQUEST['v_madori1']; $v_madori2 = $_REQUEST['v_madori2']; $v_madori3 = $_REQUEST['v_madori3']; $v_madori4 = $_REQUEST['v_madori4']; $v_madori5 = $_REQUEST['v_madori5']; $v_madori6 = $_REQUEST['v_madori6']; for($i=1 ; $i=<6 ; $i++){ if($v_madori.$i == null){ continue;//nullだったので次のループへ }else{ break;//nullじゃないということなので、forループを抜ける } //全部nullだったのでそれではまずいのでエラーページへ。 header("location:http://www.xxxxx.biz/error.html"); }

質問者が選んだベストアンサー

  • ベストアンサー
  • imasyu
  • ベストアンサー率36% (19/52)
回答No.4

可変変数を使ってNo3さんと同じ考え方でひとつ $check = false; for($i=1 ; $i<=6 ; $i++){   if(${"v_madori".$i} <> null){    $check = ture;    break;   } } if(!$check)header("location:http://www.xxxxx.biz/error.html"); 質問のソースではforループの中でコンテニューとブレイクを両方使用していましたが、これだと条件がどうであれヘッダー関数にたどり着けないような気がします。なのでNo3さんの考えが一番簡単かつよい方法だと思います。 あとforループの条件 $i=>6 じゃなくて $i<=6 だと思います。 もう既にわかってらっしゃる場合はご容赦ください。 ただこういう間違いは結構気づきにくいんですよね。

shevy
質問者

お礼

ありがとうございます。 おかげさまでうまくスクリプトを書くことができました。 チェック用の変数を用いるというのには、 気づきませんでした。 非常に参考になりました。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.3

こう考えてはいかがでしょう。 変数をもう1つ用意します。ここではとりあえず、$check という名前だとします。for ループに入る前に、$check に初期値として0を入れておきます。 for ループを使って、$v_madori1 ~ 6 をチェックします。ループ中は、$v_madori が null でない場合は $check に $i の値を入れるという処理をします。 ループ終了後、$v_madori1 ~ 6 の全てが null でなければ $check に1~6のいずれかが入っているはずですが、全て null の場合、$check は0のままです。 あとは if 文で $check の値を見て、0の時にはエラーのページに飛ぶ、という処理をすれば完成です。 なお、$check が0でなくなれば $v_madori1 ~ 6 のいずれかはチェックされているということですから、$check が0でなくなった時点で for ループを打ち切っても構いません。 当方は php には詳しくないので文法的には自信がありませんが、こんな感じでしょうか。  //チェック用変数を初期化  $check = 0;  //$v_madoriを全て調べる  //$checkが変更されたら、その時点でチェック終了  for( $i=1 ; $i<=6 && $check == 0 ; $i++ )  {   //nullでなければ、チェック用変数を更新   if( $v_madori.$i != null )   {    $check = $i;   }  }  //全てnullだった場合、エラーページへ  if( $check == 0 )  {   header("location:http://www.xxxxx.biz/error.html");  } チェック用の変数を用意し、その値がループの前と後とで変わっているかどうかで判断する方法はよくある手法なので、よろしければご参考までに。 (上記のプログラムで文法の誤りがありましたら、お手数ですが正しく修正してご利用下さい)

shevy
質問者

お礼

ありがとうございます。 チェック用の関数を用いるという手法、 今後もどんどん使えそうですね。 よくある手法とのことなので、 今後解析をこなす際にも非常に参考になります。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • okotaegoo
  • ベストアンサー率46% (6/13)
回答No.2

全く試してみてないので、自信ないのですが if(($v_madori.$i) == null) にしては?

shevy
質問者

お礼

ありがとうございます。 可変変数についてまったく疎かったので、 今回の質問では非常に勉強になりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

配列使うか、可変変数使うかかな。 ただの数字なら、普通は配列かと。 可変変数だったら、${"v_madori".$i}

shevy
質問者

お礼

恥ずかしながら可変変数の使い方、理解していませんでした。 ですが、今回のおかげでばっちりマスターできました。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • continueでforループを抜けられません。

    for($i=0;$i<100;$i++){ if($i == 50){continue;}} としてるんですが、ループを抜けてくれません。 continue(2)とすると、 Cannot break/continue 2 levels in そんなに抜けられない!とエラーが出るので読み込んではいるんですが。

    • ベストアンサー
    • PHP
  • for文が全然ループしていない

     下のようなfor文を作って回してみましたが、チェックのために一番最後に書いたPRINT文で「0」が表示され、その下に下線表示だけです。  一体どこが悪いのでしょうか。全く分かりません。  また「$i==9」を「$i=<9」と書いていましたら、エラー表示になりました、何が原因でしょうか。  エディター(TeraPad)の認識に原因があるのでしょうか。  文法のエラー表示は出ていません。  9*9の表を表示させるだけの簡単なコードなのですが。 <html><head><title>make_matrix_html</title></head> <body> <table border="1"> <?php for($i=1;$i==9;$i++){ print ("<tr><br />"); for($j=1;$j==9;$j++){ print ("<td>".($i*$j)."</td>"); } print ("</tr>"); } print ($i*$j); ?> </table></body></html>

    • ベストアンサー
    • PHP
  • header()関数によるリダイレクトについて

    下記のようなスクリプトにおいて、header()関数で、リダイレクトしているのですが、 ちゃんとリダイレクトできません。ちなみに、header()関数の前には HTML文も無い、PHPのみのスクリプトです。 どうすれば、リダイレクトできるか教えていただきたいのですが。 【profile_regist.php】 <?php if($_POST['ID_HANDLENAME']!==NULL) $handlename = $_POST['ID_HANDLENAME']; else header("Location: ~.html"); 中略 ?>

    • ベストアンサー
    • PHP
  • ループ forに関して for($i = $num ; $i < $max ; $i++)

    phpの初心者です。 以下の記述ですが、上手にループしてくれません。 for($i = $num ; $i < $max ; $i++) $num の部分に「0」を入れると稼動するのですが、変数を代入したいというのが希望です。 方法があったらご教授下さい。

    • ベストアンサー
    • PHP
  • forループで$iを表示させるには?

    ループで文字連結は出来ないのですか? ↓がはまりどころです。 $test1 = "abc"; $test2 = "def"; for($i=1; $i<=2; $i++){ echo $test.$i; } 上記だと変数が見つかりませんってことでエラーになります。 $test.$iのところをカッコを付けたり評価させてみたりでいろいろ試したのですがどうにもうまくいかないのでご教授いただければと。 配列なら問題ないんですけど…。 $test[1] = "abc"; $test[2] = "def"; for($i=1; $i<=2; $i++){ echo $test[$i]; }

    • ベストアンサー
    • PHP
  • forループが回らない

    以下のコードで何故for文が回らないのか教えてください。 ど素人の質問で申し訳ありません。 一応、本に書いてある通りにコーディングしたつもりなのですが・・・ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis">  <title>なんでforループが回らないの?</title> </head> <body> <script type="text/javascript"> list_term=new Array("HOME", "FAQ", "ご利用規約", "プライバシーポリシー", "サイトマップ", "お問い合わせ"); document.write(list_term[0]+'<br>') document.write(list_term[1]+'<br>') document.write(list_term[2]+'<br>') document.write(list_term[3]+'<br>') document.write(list_term[4]+'<br>') document.write(list_term[5]+'<br>') document.write('<br>')  for(i=0; i==6; i++) document.write(list_term[i]+'<br>') </script> </body> </html>

  • forループの中での初期化

    class Foo{   public static void main(String args[]){     int x=10;     for(int i=0;i<5;i++){       System.out.print(x+i);     }     System.out.print("\n"+i);   } } このプログラムはコンパイルエラーが出ます。 iがforループの中で宣言されていてその外では無効だからです。 そこで class Foo{   public static void main(String args[]){     int x=10;     int i;     for(i=0;i<5;i++){       System.out.print(x+i);     }     System.out.print("\n i="+i);   } } のようにしてみました。 i=5と出ました。 ふと、iは確かに宣言されているけど、初期化はforの中でしかされていないのになぜコンパイルエラーにならなかったんだろう??、と思ってしまいました。 おかしくないでしょうか?

    • ベストアンサー
    • Java
  • 配列生成される限り、ループしたい

    function arrayxml (){ urlで取得したXMLから、配列を取得 return $hairetu; //戻り値は多次元配列 } $data = arrayxml(); $cnt = count($data); do { for ($i=0; $i < $cnt; $i++) { $data = arrayxml($data[$i][0]); } } while (count($data) > 0); //関数によって配列が作られる限り このスクリプトではループはうまくされません。 $data = arrayxml($data[$i][0]);を--->arrayxml($data[$i][0]);にすると $cnt分ループされますが、do~whileのループはなされません。 関数で配列が生成される限り、do~whileループをさせたいのですが正しい方法を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • [VBA] for文の3次元ループ

    for文の3次元ループがうまく働いてくれません。 8通り(2x2x2)の組み合わせ表示を期待しましたが2通り(y1のみ)のみでループが終わってしまいます。エラーなどはでません。何が原因なのか分かりません。ご指導お願いします。 Public x1 As Single, y1 As Single, z1 As Single Sub Start1() i=1 For x1 = 0.3 To 0.4 Step 0.1 For y1 = 0.5 To 0.6 Step 0.1 For z1 = 0.4 To 0.5 Step 0.1 Cells(i, 1) = x1 Cells(i, 2) = y1 Cells(i, 3) = z1 i=i+1 Next z1 Next y1 Next x1 End Sub

  • なぜ、この場面で、ループ関数が必要なのでしょうか!

    プログラムレベルは下の下です。  以下のHPはhtmlとphpプログラムのコラボレです。  "表示"タグをクリックすれば、  "Google" "Yahoo" " CBS News" "abc NEws" のタグが出てきて、クリックすれば、ホームページが見れるという  単純なHPです。  そこで、分からに事があります。 sample6.htmlの中に"for"関数がありますが、ループ関数が使われています。 このプログラムのからくりを勉強中ですが、現在ループでつまづいています。_ _  なぜ、この場面で、ループ関数が必要なのでしょうか!?  以下プログラムです、宜しくお願いします。  ファイル名:sample6.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>配列とJSON</title> <script type="text/javascript" src="../lib/jquery-1.8.1.min.js"></script> <script type="text/javascript"> $(function (){ $("#exe").click(hello); }); function hello(){ $.get("sample6.php", {}, function(resp){ var json = eval(resp); var tags = ""; for (var i = 0; i < json.length; i++) { if(i==0){ tags +="<div>サーチ&ポータル</div>"; }else if(i==2){ tags +="<br/><div>USニュースサイト </div>"; } tags += '<a href="' + json[i].url + ' "> ' + json[i].name + '</a><br/>'; } $("#show").html(tags); }); ;} </script> </head> <body> <h2>配列、連想配列とJSON <input type="button" id="exe" value="表示 "/><h2> <p id="show"></p> </body> </html> ファイル名:sample6.php <?php $arr[0]["name"] = "Google"; $arr[0]["url"] = "http://www.google.co.jp/"; $arr[1]["name"] ="Yahoo!"; $arr[1]["url"] = "http://www.yahoo.co.jp/"; $arr[2]["name"] = "CBS News"; $arr[2]["url"] = "http://www.cbsnews.com/"; $arr[3]["name"] ="abc News"; $arr[3]["url" ]= "http://abcnews.go.com/"; header("Content-Type: text/javascript; charset=utf-8"); echo json_encode($arr); ?>

マルチモニターの接続とは?
このQ&Aのポイント
  • Lifebook <WU2/E3>を購入しました。ディスプレイの接続で2点お教え下さい。
  • USB-TypeC接続のケーブル種類のタイプは何を購入するのが良いでしょう?
  • PCの2つあるUSB-TypeCのうち1つを電源コードで利用すると、4画面でなく3画面出力となる認識で良いですか?
回答を見る