PHPコード読解|配列への数値の格納方法とif文の動作について

このQ&Aのポイント
  • PHP初心者のため、配列に数値を格納する方法とif文の動作について質問があります。
  • 質問内容の要点は、配列に数値を格納する際に$result = array()と結びつける必要があるかどうか、そしてif文とelse文の動作についてです。
  • 要約すると、「PHPの配列への数値の格納方法とif文の動作についてお聞きしたいです。具体的には、$result = array()と結びつける必要があるか、if文とelse文の実行順序についても教えてください。」です。
回答を見る
  • ベストアンサー

PHPコード読解お願いいたします

PHP初心者で独学で学んでいるものです。 クラスの概念まで一通り勉強、納得したうえ、簡単なプログラムを見て勉強している段階。 下記コードにて疑問点ありますのでご教授ください。 疑問の部分に●をうっています。 開発環境: XAMPP1.7.0(最新)にて一括ダウンロード /* 自動で倒したピンを求めるロジック */ //ボーリングの得点結果を格納する配列 $result = array();● $pin = 10; $flag = 0; //1ゲームから10ゲームまで繰り返す for ($i = 1; $i <= 10; $i++) { $end_flg = 0; ●● for ($j = 1; $j <= 3; $j++) { if ($j == 1) { $nowpin = $pin; } if ($i == 10) { $pin_out = rand(0,$nowpin); $result[$i][$j] = $pin_out; $nowpin = $nowpin - $pin_out; if ($nowpin == 0) { $nowpin = $pin; $flag = 1; } if($j == 2 && $flag == 0) { break; } } else { if ($j == 3) { break; } $pin_out = rand(0,$nowpin); $result[$i][$j] = $pin_out; $nowpin = $nowpin - $pin_out; if ($nowpin == 0) { break; } } } } print "<pre>"; print_r($result); for文によりフレーム、回数が繰り返される。 1フレームの1投目に変数pinの値(10)が変数nowpinに格納される。 elseブロックへ入り、rand関数により変数pin_outに1~10までの数値が入る。 配列 result「1」「1」にrand関数により得られた数値が入る。 print_r($result)により出力。 変数nowpinに残りのピンの数が入る。 仮に変数nowpinに格納される数値が0ならば、ブレイクによりfor($j、$j<=3、$j++)の繰り返しから抜け、2フレーム目へ。 (字数の関連でその後省略) ●配列で数値を格納するには$resultを=でarray()で結びつけなければいけないのでしょうか ●●この変数の意味。この場所におく必然性。   * if文に関してコード内にelse含め、いくつもありますが、いずれかのifを実行したあと、elseを実行することなどありえるのでしょうか。 例えば、$i=1 $j=1(1フレーム、1投目)の場合、まず1つ目のif($j==1)と合致するので、その中の命令文を読み込み、またelse文内のrand関数も読み込んでいっています。 そもそもifの条件に合致しない場合にelseがあるのであって、ifもelseも読み込むのは感覚的な疑問が残ります。 コンピュータは単に上から下に逐次処理していっているからifもelseも読み込んでいくという理解でよろしいのでしょうか。 以上よろしくお願いいたします

  • --w--
  • お礼率29% (35/117)
  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

if else の大きな流れは if ($j == 1) { $nowpin = $pin; } // elseがないので以下は普通に実行される if ($i == 10) { // 10フレーム目の処理 } else { // 10フレーム以外(つまり1-9フレーム)の処理 } ですね

その他の回答 (1)

  • harutovx
  • ベストアンサー率50% (11/22)
回答No.1

$result = array(); については、リテラル配列で有ることを明確に示して初期化処理を行っています。配列を扱うときにはこの処理をすると暗記しましょう。 $end_flg = 0; については、このソースからは読み取れません($end_flgを参照していないため)、変数名から予想すると終了条件のフラグかと思われますが。 ここに提示されたソースだけだと、不要な物です。 if とelseについて また、インデント(字下げ表記)が行われていないため非常にわかりにくいですが、このソース中にあるelseは、 if ($i == 10) {に対応するelseです。 if ($j == 1) { $nowpin = $pin; } のif文は完結しているため関係有りません。

関連するQ&A

  • 一度に複数の値を取得できる乱数ってありますか?

    PHP Version 5.1.6を使っています。 例えば、1から10まで整数の中から値が重複しないように ランダムに8個選びたいような時で、自分が思いつた選び方は、 for($i=0; $i<8; $i++){ $r = rand(1, 10); $flag = false; for($j=0; $j<Count($list); $j++){ if($r == $list[$j]){ $flag = true; break; } } if($flag){ $i--; continue; } $list[] = $r; } print_r($list); なんですが、これだと効率が悪いような気がします・・・ そこで重複しないようにランダムに選べる乱数や またはそういう関数はあるのでしょうか?

    • 締切済み
    • PHP
  • 逆向きの数字を比較するぷろぐらむの一部

    コンピュータが任意に乱数で4ケタの数字を入力し、それを配列に 格納する。 そして、人間がその数字を逆向きに4ケタ、数字を配列に格納する。 というプログラムの一部を記載しました。 ところが、逆向きに入力してみてもうまく全て「間違いです。」 と表示されてしまいます。どこがおかしいか指摘していただきたいです。 よろしくお願いいたします。 do{ val=rand()%10; comp[0]=val; }while(comp[0]==0); for(i=1;i<4;i++) { do{ val=rand()%10; for(j=0;j<i;j++) { if(comp[j]==val) { break; } } }while(j<i); comp[i]=val; } for(i=0;i<4;i++) { printf("%d",comp[i]); } fflush(stdout); sleep(500); printf("\r入力せよ:"); scanf("%s",human); for(i=0;i<4;i++) { if(human[i]!=comp[3-i]) { ero=1; break; } } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); }

  • java

    java プログラミングで3×3の○×ゲームを作りたいのですが、エラーが出てしまいます。 どこに問題があるかわかりません。 教えていただけたら嬉しいです。 長くなってしまいますが、ご了承ください(コメント一部略)。 import java.io.*; // マスにの中身が // 空白: 0 // O : 1 // X : 2 class ox { // 勝敗の判定をするメソッド // 勝敗が付いていなければ0 を // O の勝ちなら1 を // X の勝ちなら2 を // 引き分けなら-1 を // それぞれ返す。 static int judge( int board[][] ) { int i, j, flag; for( i = 0; i < 3; ++i ) { flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[j][i]; // <=> flag = flag & board[j][i] if( flag != 0 ) return flag; } // 縦の列を調べる for( i = 0; i < 3; ++i ) { flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[i][j]; if( flag != 0 ) return flag; } // 左上→右下のナナメ flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[j][j]; if( flag != 0 ) return flag; // 右上→左下のナナメ flag = 1 | 2; for( j = 0; j < 3; ++j ) flag &= board[2-j][j]; if( flag != 0 ) return flag; // まだ置けるマスがあるかの判定 flag = 1; for( i = 0; i < 3; ++i ) { for( j = 0; j < 3; ++j ) flag *= board[i][j]; } // flag != 0 ってことは、置けるマスは無い→勝負が付いた // どちらかが勝ったのなら、上でreturn しているはず // ということで、引き分け if( flag != 0 ) return -1; // 何事もなければ、勝負続行 return 0; } // 番面の様子を表示するメソッド static void show ( int board[][] ) { String display = ""; String masu[] = { " ", "O", "X" }; int i; display += " |1|2|3\n"; for( i = 0; i < 3; ++i ) { display += "-+-+-+-\n"; display += (i+1) + "|" + masu[board[0][i]] + "|" + masu[board[1][i]] + "|" + masu[board[2} System.out.println( display ); } static int isreach( int three[], int turn ) { int i, result; // 各マスの値を2 乗して足し合わせる result = 0; for( i=0; i<3; ++i ) result += three[i]*three[i]; // リーチなら、下の条件を満たすはず if( result == 2*turn*turn ) { for( i=0; i<3; ++i ) if( three[i] == 0 ) break; return i; } return -1; } static int rival( int board[][] ) { int x,y,i,j,n; int three[] = new int[3]; // x, y が未定である事を明示 for( i=0; i<3; ++i ) { for( j=0; j<3; ++j ) three[j] = board[j][i]; 続きは追記にて

  • 二つのint型配列を一つにするには?

    2種類のint型配列にそれぞれ数が重ならないように数字を代入して行きます。この2種類のプログラムの違いは値を代入する方法以外はすべて同じです。ですから、ユーザー関数で一つにまとめようと考えてます。 2種類の違い:値を代入する方法がが違う。 (1)scanf()関数で人間が値を各要素に代入する。 (2)rand()関数でPC側が値を各要素に代入する。 配列への代入のルール (1)同じ値の場合は代入しなおさなければならない。 基本的には 人間側が値を要素に代入する場合 for( i = 0 ; i < 6 ; i++){ while(1){ scanf("%d",&dut[i]); for (j = 0; j < i ; j++){ if(dut[i] == dut[j]){flg = 1; break;} } if (flg == 0){break;} } } PC側がrand()関数を使い各要素に入力した場合 for( i = 0 ; i < 6 ; i++){ while(1){ pc[i] = rand()%43 + 1; for (j = 0; j < i ; j++){ if(pc[i] == pc[j]){flg = 1; break;} } if (flg == 0){break;} } } 以上の二つの違うところは「rand()関数かscanf()」どちらかが入るだけです。あとはみな同じつづりなのです。だから一つに出来ると思うのです。 共有して使える関数はどんどんまとめちゃうのが私の考えですので。 ※ヘッダ呼び出しや、変数定義など基本的な部分は省いてあります。 間違いがあるときはおしえてください。 ※また、別の方法があるときはぜひおしえてください。

  • プログラム停止について。

    こんばんは。 今作成しているプログラムにout[i][j]という出力用の多次元配列があります。この出力が全て同じになった時、プログラムを停止するようにしたいと思っています。 そこで、以下のような方法を考えました。 for( ; ; ) { //無限ループ flag = 0; for( i = 0; i < 10; i++ ) { for( j = 0; j < 4; j++ ) { System.out.print( out[i][j] ); if( out_sub[i][j] != out[i][j] ) { flag = 1; out_sub[i][j] = out[i][j]; } } System.out.println(); } if ( flag == 0 ) { System.exit(0); } } ですが、これがうまくいかず行き詰っています。 何かいい方法があったらぜひ教えてください。また、間違い等、指摘していただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ループが無駄に複雑な気が…

    以下は私が作成したプログラムで、 1.form[4][4][4]の三次元配列に0~32のランダムな正の整数を入れる 2.このランダムな数値の同じものは2つまで 3.form[i][j][0]~form[i][j][3]には同じ数値が入ってはいけない という条件を考えて作成したのですが、無駄に複雑になった気がします。 このプログラムはform[i][j][0]~form[i][j][3]が入らないように、数値が被ったら最初からやり直しにしています。 この作り方だと、これ入れないと最後の1個が被ってしまうものだったら無限ループが起きてしまうので…。 この無駄に複雑になってしまった気がするプログラムを、もっとシンプルに出来ないでしょうか? import java.util.Random; public class Loop { public static void main(String[] args){ int num; int[] check=new int [32]; int[][][] form=new int[4][4][4]; Random rand=new Random(); int i=0,j=0,k=0; for(i=0;i<32;i++) check[i]=0; i=-1; while(true){ while(true){ while(i<3){ num=rand.nextInt(32); if(check[num]!=2){ i++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; if(0<k){ for(int l=0;l<k;l++){ if(form[i][j][k]==form[i][j][l]){//同じだったらループのやり直し for(int m=0;m<32;m++) check[m]=0; i=-1; j=0; k=0; } } } } } if(j==3) break; num=rand.nextInt(32); if(check[num]!=2){ i=0; j++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; } } if(k==3) break; num=rand.nextInt(32); if(check[num]!=2){ i=0; j=0; k++; form[i][j][k]=num; System.out.println(i+" "+j+" "+k+" "+form[i][j][k]); check[num]++; } } for(i=0;i<4;i++){ for(j=0;j<4;j++){ for(k=0;k<4;k++){ System.out.println(k+" "+j+" "+i+" "+form[k][j][i]); } } } System.out.println("end"); System.exit(0); } }

    • ベストアンサー
    • Java
  • forループに慣れるには

    初めまして。 今資格を取ろうと思い独学でJavaを勉強してるんですが、 つまらない部分でつまずいています。 それは少々複雑なfor等のループです。 変数を追っていくうちにこんがらがってしまい、 変数の正しい値を見失ってしまいます。 例えば… Loop: for(int i = 0; i<5; i++) { for(int j =0; j<5; j++) { if(i==j) continue Loop; System.out.println("i = " +i+ "j = " +j); if(i > 3) break Loop; } } や、 int i,j; for(i = 0, j = 0; i<3;) { if(i++ == 2 || j++ == 2) break; } System.out.println(i); System.out.println(j); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。

  • Cのソースコードについて

    #include<stdio.h> int main(void) { long a[6000],sum[6000],max=0; int i,j=0,n,m; for (m = 0; m <= 6000; m++) sum[m] = 0; for (i = 0;; i++) { scanf_s("%ld", &a[i]); if (a[i] > 0) sum[j] += a[i]; else if (a[i] < 0) { j++; sum[j] = -1; j++; } else break; } for (n = 0; sum[n] == 0; n++) { if (max < sum[n]) max = sum[n]; } printf("%ld",max); while(1){} return 0; } こんなコードを書いたのですが 答えが常に0になってしまいます。 原因がはっきりしないので教えてください 使用言語はCです

  • phpについて

    ボタンをクリックするとform.htmlが呼び出され 一定数、クリックするとlast.htmlが表示されます。 この設定をform01~form09.htmlまで順次に表示させ るにはどうしたら良いのでしょうか? (最後にlast.htmlを表示) ================================== if ($_CONF_RANDOM == 1) { mt_srand(microtime()*100000); $r = mt_rand(0, 9); $i = 0; // ファイルが見つかるまで繰り返し while(!file_exists("./form" . $r . ".html")) { $r = mt_rand(0, 29); // 永久機関になるとまずいので・・・ $i++; if ($i > 9999) break; } if (file_exists("./form" . $r . ".html")) require "./form" . $r . ".html"; } else { if ($_num < $_CONF_MAX_CLAP) require "./form.html"; else require "./last.html"; } ================================== if ($_num < $_CONF_MAX_CLAP)    require "./form.html"; else    require "./last.html"; をいじれば良いのは分かっているのですが 文の書き方が分からず困っています。 皆様方からのアドバイスを頂けないでしょうか?

    • 締切済み
    • PHP
  • このソースコードについて

    AOJにてこのコードを提出したところTime Limit Exceededでドロップされました。 Visual studio 2013 で動かしたところ特に怪しい挙動や間違いを出力することはなかったのですが。。。 ちなみに言語はC++です。 問題のURL http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0056 #include<iostream> #include<math.h> using namespace std; int p[20000],d; void primefinder(int a){ p[0] = 2; int k, l = 0; for (int i = 3; i <= a; i++){ k = (int)sqrt(i); for (int j = 2; j <= k + 1; j++){ if (j == k + 1){ p[++l] = i;} else if (i%j == 0)break; } } d = l + 1; } int main(){ int n,m,q,count; while ((cin >> n), n){ count = 0; m = n / 2; primefinder(m); for (int i = 0; i < d; i++){ q = n - p[i]; if (q <= 1)continue; for (int j = 2; j <= (int)sqrt(q)+1; j++){ if (j == (int)sqrt(q) + 1)count++; else if (q%j == 0)break; } } cout << count << endl; } }