• ベストアンサー

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