• ベストアンサー

ループ処理でシンプルにまとめる方法を教えてください。

(例) for ($j=0;$j<=count($arGroup)-1;$j++){ for ($i=0;$i<=count($arGroup[$j])-1;$i++){ if($j == 0){ echo "(".$number[0][$i+(count($ar)-1)].")\n"; }elseif($j == 1){ echo "(".$number[0][$i+(count($ar)-1)+(count($arGroup1))].")\n"; }elseif($j == 2){ echo "(".$number[0][$i+(count($ar)-1)+(count($arGroup1))+(count($arGroup2))].")\n"; }elseif($j == 3){ echo "(".$number[0][$i+(count($ar)-1)+(count($arGroup1))+(count($arGroup2))+(count($arGroup3))].")\n"; } } } このループ処理をもっとシンプルにしていきたいと思います。 jの数が増えていく予定)+(count($arGroup数字))が追加されていくような形になります。 どなたか教えてください。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • mpx
  • ベストアンサー率71% (149/209)
回答No.1

やりたい事を理解できているかどうか自信が無いので 期待通りに動くかどうかも未確認ですが、こんな感じかな? for ($j=0;$j<=count($arGroup)-1;$j++){ for ($i=0;$i<=count($arGroup[$j])-1;$i++){ $key=$i+(count($ar)-1); for ($k=1;$k<=$j;$k++){ $key+=count(${'arGroup'.$k}); } echo "(".$number[0][$key].")\n"; } }

hunter_999
質問者

お礼

完璧です。 なんとお礼をいったらいいか 本当に感謝してしております。 ありがとうございました。

その他の回答 (1)

noname#87667
noname#87667
回答No.2

すでに回答No.1で決着がついているようなので、この質問を締め切って、No.1の方に良回答としてポイントを提供してください。 以下、気になった点を書きますが、本題とは無関係なので、ポイントは不要です。 if文での分岐を使う場合は、2~3パターンが上限だと思います。それ以上の場合は、switch文を使ってください。 あと、「$number[0][$i+(count($ar)-1)]」が何度も使われているようなので、if文の前で「$hoge=$number[0][$i+(count($ar)-1)];」と変数hogeを定義して、それを使い回すと短くなりますよ。

関連するQ&A

  • ループ処理について

    テキストファイルにある数字が存在するかしないかの判断をしたいですがうまくいきません、どこが悪いのでしょうか・・・。 <?php $log=file("1.txt"); for($i=1;$i<count($log);$i++){ echo"<a href=1.php?no=$i>$i</a> ";} echo"<BR><BR><BR><BR><BR>"; if ($_GET["no"]) { $no = $_GET["no"]; $log=file("1.txt"); for($i=0;$i<count($log);$i++){ $list=explode("<>",$log[$i]); if($no==$list[1]){echo"$list[0]"."はOk<BR>";} elseif($no!=$list[1]){echo"";} } if($no!=$list[1]){echo"存在しません";} } ?> 1.txtの中身は 7<>7<> 8<>7<> 5<>5<> 6<>5<> 3<>3<> 4<>3<> 1<>1<> 2<>1<> 右の数字(7・5・3・1)が存在確認対象で、 ?no=数字で呼び出し、getでの呼び出し数字が右に存在すれば左の数字を表示します。 存在しなかったら 存在しません という言葉を1回だけ表示します。 no=1とno=2 no=4 no=6だけ上手くいくのですが、他はokと存在しませんが両方混在してしまいます。no=3 5 7も1 2のようにしたいのですが、 どう記述すれば上手い具合にいくでしょうか? よろしくお願い致します。

    • 締切済み
    • PHP
  • エクセルのVBA、ループ処理について

    if文とループ処理をどう組み合わせればいいのかわかりません 以下のコードで、iの数をを増やしていく処理を行いたいのですが、エラーがでてしまいうまくいきません どのように書けばいいのでしょうか 教えてください For i = 2 To 11 If Cells("4,i") > 80 Then Cells("5,i").Value = "A" ElseIf Cells("4,i") > 70 Then Cells("5,i").Value = "B" ElseIf Cells("4,i") > 60 Then Cells("5,i").Value = "C" Else Cells("4,i").Value = "D" End If Next

  • ループ処理を抜けた時点での処理回数を表示したい

    今、以下のような「green」が配列の何番目にあるのか調べるプログラムを考えています。 具体的な処理としては、配列の値を順番に調べて「green」を見つけたらループをぬけて何番目にあったかを表示する、といった処理になります。 ただ、現時点ではループをぬけた時何番目だったのかを取得できないでいます。 $numを取得して表示するにはどのような処理を行えばよいでしょうか。 解説していただけると幸いです。 ---プログラム--- class hoge{ function hoge(){ $this->color = array("red", "blue", "pink", "white", "black", "gold", "yellow"...,"green",...); } function test(){ for($i = 0;$i < count($this->color);$i++){ if($this->color[$i] == 'green'){ echo $this->color[$i]."\n"; break;###ここでループをぬける } } echo "緑は${num}番目"; } } $a = new hoge(); $a->test(); ---

    • ベストアンサー
    • PHP
  • アルゴリズムの名前を教えてください

    16ビットのデータが、たとえば1000個、配列で与えられているとします。 unsigned short data[1000]; このデータをしらべて、重複するものを除いて何種類の値があるかを数える場合、一番素朴な方法だと、次のようにやると思います。 int i, j; int count = 0; for(i = 0; i < 1000; i++) {  for(j = 0; j < i; j++) {   if(data[j] == data[i]) {    break;   }  }  if(i == j) {   count++;  } } この方法だと、2重のループがあって処理に時間がかかります。そこで、メモリに余裕があれば内側のループをやめて、 int i; int count = 0; int flag[0x10000]; int n; for(i = 0; i < 0x10000; i++) {  flag[i] = 0; } count = 0; for(i = 0; i < 1000; i++) {  n = data[i];  if(flag[n] == 0) {   flag[n] = 1;   count++;  } } これだと、2重のループを使うものよりは速くなりますが、データが1000個しかないのに、65536個のflagをクリアするのに時間がかかり、今ひとつです。 ところが、次のような賢い方法があり、2重のループも配列のクリアも無くすことができます。 int i; int count = 0; unsigned short flag[0x10000]; unsigned short link[0x10000]; int n; for(i = 0; i < 1000; i++) {  n = data[i];  if(flag[n] >= count || link[flag[n]] != n) {   flag[n] = count;   link[count] = n;   count++;  } } 私がこのアルゴリズムを知ったのはかなり昔なので、どこで知ったのか思い出せないのですが、これほど賢いアルゴリズムだから何か名前がついていると思うのですが、それがわかりません。 名前がわからないので、人に頼んだりする時、上のような長い説明をしなくてはなりませんが、名前がわかっていれば「??法でやっといて」、と言えばいいのですけど。

  • 3次元配列のループによる比較の回数を減らす

    以下は正の整数が入った3次元配列form[30][20][8]で、中身が一致している2カ所に-1を代入してループを抜けるというプログラムの一部分なんですが、無駄なループを減らすにはどういった変更をすればいいでしょうか? form[30][20][8]は変更しない方向でお願いします。 check: for(int i=0;i<30;i++){ for(int j=0;j<20;j++){ for(int k=0;k<8;k++){ for(int l=0;l<30;l++){ for(int m=0;m<20;m++){ for(int n=0;n<8;n++){ if(form[i][j][k]==form[l][m][n]&&!(i==l&&j==m&&k==n)form[i][j][k]!=-1) count++; form[i][j][k]=-1; form[l][m][n]=-1; break check; } } } } } } }

    • ベストアンサー
    • Java
  • ループ処理

    HTMLのID属性、name属性をループで回したいと 考えています。 ***イメージ*** <TABLE> <TR> <?php $count = 0; for($a = 0; $count < 20;$count++){ ?> <TD> <SELECT id = "ABC" name = "Nuryoku[]"> print "<option value =<?php echo $count?>$count</option>"; </SELECT> </TD> </TR> SELECTとOPTIONタグが20個必要であり、それぞれ ID属性のABCを1~20、name属性Nuruyoku[]を1~20 ループでまわしたいと考えています。 (例) ABC1 Nuruyoku1[]    から ABC20 Nuruyoku20[] このような事が可能なのでしょうか? もし可能であればアドバイスをよろしくお願い致します。

    • ベストアンサー
    • PHP
  • ループ処理について

    こんにちわ。ループ処理についての質問があります。 現在、ページ内での「前へ」というボタン設定をしています。その際、コード番号を元にして値をもってきていますが、1つ前のコードがない場合、DB内の更に前のコードを自動的に調べて持って来たいのです。 コードのtypeがTEXTで、値が03-00122のように入っています。 1つ前だけならこれでできるのですが、DB内の更に前のコードを自動的に調べて作成する方法が多分ループ処理を使って、$rs==1の時(データが存在する時)にぬければいいと思うのですが・・ どなたかご教授の方、お願いします。 php4.2です。 //年度取得 $N=substr($Number,0,3); //「前へ」 $i=1; $H=substr($Number,-5)-$i++; $I='000'.$H; $J=substr($Number,0,2); $BackNumber=$J.'-'.substr($I,-5); //$BackNumberがあるか確認 $sl="select * from student where number='$BackNumber'"; $rs=pg_exec($con,$sl); $row=pg_numrows($rs); //numberのmin値を得る $min = "select min(number) from base where number like '$N%'"; $resource_id = pg_exec($min); $remin = pg_result($resource_id, 0, "min"); // 1ページ目じゃなかったら「前へ」をつける if ($remin != $Number){ $prev = $page - 1; print("<A HREF=\"base.php?Number=$BackNumber\"><I>前へ</I></A>\n"); print(" \n"); }

    • ベストアンサー
    • PHP
  • ループ処理について。

    下記のようなプログラムを作りました。 機能としては同じDB内にある異なるテーブルの日付を比較し、 違うものがあれば挿入するというものです。 ただしこの場合ではうまくいきません。 (1)テーブルの値を順に読み取り、 (2)にあるテーブル全ての行に対応させ、 ある行に値があれば、ループをぬけて そのsql文には空にするという形にしたいのですが、 このままですと条件文だけしかぬけていません。。。 何かよい方法があればご教授お願いいたします。 //比較するテーブル・・・(1) for($i=0;$i<$num;$i++){ $num_i=(レコードを取得する関数); //挿入するテーブル・・・(2) for($j=0;$j<$num;$j++)} $num_j=(レコードを取得する関数);    //日付が同じでなければ挿入する if($num_i["start_date"] != $num_j["start_date"] && $num_i["end_date"] != $num_j["end_date"]){ $sql[$i]="INSERT INTO date (start_date,end_date) VALUES(".$num_i["start_date"].",".$num_i["end_date"].");"; } else{ $sql[$i]=""; break; } } if($sql[$i] != ""){ print($sql[$i]); } }

    • ベストアンサー
    • PHP
  • 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); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。

  • しりとり 無限ループ?

    【予約語から最長のしりとりを作ろう!】 https://codeiq.jp/ace/stakemura/q408 この問題やってるんですが 処理がtimeoutしちゃいます 最長の結果が10個程度の時は期待通りに動作します 期待される結果が20程度になると(?)timeoutします 単にウチのマシンじゃムリなのか、工夫が足りないのか 無限ループを起こしてるのか、重いだけなのか判断つきません よろしくお願いします (cpp11_keywords.csvはC++の予約語84個のcsvです) <?php $data=explode(chr(10),file_get_contents('cpp11_keywords.csv')); foreach($data as $i=>$cpp){$data[$i]=trim($data[$i]);} echo(implode('<br/>',createSiritori($data))); function createSiritori($words){ $rtn=array(); $data=array(); for($i=0,$len=count($words);$i<$len;$i++){ $data[$i]=array(); for($j=0;$j<$len;$j++){ if($i==$j)continue; if(is_connectable($words[$i],$words[$j]))$data[$i][]=$j; } } $rcd=0; for($i=0;$i<$len;$i++){ $crr=array($i); for($j_arr=array(0),$j_ind=0,$len_arr=array(count($data[$i]));$j_arr[0]<$len_arr[0];$j_arr[$j_ind]++){ if($j_arr[$j_ind]>=$len_arr[$j_ind]){ array_pop($crr); array_pop($j_arr); array_pop($len_arr); $j_ind--; }else if(!in_array($data[end($crr)][$j_arr[$j_ind]],$crr)){ $crr[]=$data[end($crr)][$j_arr[$j_ind]]; $j_ind++; $j_arr[$j_ind]=0; $len_arr[$j_ind]=count($data[end($crr)]); if($j_ind>$rcd){$rcd=$j_ind;$rtn=$crr;} } } } for($i=0,$len=count($rtn);$i<$len;$i++){ $rtn[$i]=$words[$rtn[$i]]; } return $rtn; } function is_connectable($a,$b){ return (substr($a,-1)==substr($b,0,1)); }

    • ベストアンサー
    • PHP

専門家に質問してみよう