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

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

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

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

Q&A

解決済

4回答

2998閲覧

for文のネスト化

SugiuraY

総合スコア317

PHP

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

0グッド

0クリップ

投稿2016/11/02 05:39

お世話になっております。

以下のように、for文で4つ区切りのデータを出力しようと考えております。
数が非常にいい多いため、これをfor文を入れ子にすることにより、きれいなコードでかけるのではないかと考えているのですが、なかなか思いつきません。
1)全部で$iの個数は $total=floor(count($final)/4);です。
端数が出た場合にはif文により$iがissetであれば出力するように分岐する予定です。

2)それぞれ4個の固まりでひとくくりの処理($i=0; $i<4)します。

従った中のfor文は$=0,$i=1,$i=2,$i=3の一つとびで、外側のfor文は0-4、4-8、8-12、、、、となるイメージですが、うまくコーディングができません。。

答えには近づいていると思うのですが、どなたかアドバイスをいただけませんでしょうか。
宜しくお願い申し上げます。

for ($i=0; $i <4 ; $i++) { echo "<td style=\"width:200px;\" ><input type=\"checkbox\" name=\"asset\" value=\".$final[$i].\" id=\"ck.$final[$i].\"><label for=\"ck.$final[$i].\"> $final[$i]</label></td>";} for ($i=4; $i <8 ; $i++) { echo "<td style=\"width:200px;\" ><input type=\"checkbox\" name=\"asset\" value=\".$final[$i].\" id=\"ck.$final[$i].\"><label for=\"ck.$final[$i].\"> $final[$i]</label></td>";} for ($i=8; $i <12 ; $i++) { echo "<td style=\"width:200px;\" ><input type=\"checkbox\" name=\"asset\" value=\".$final[$i].\" id=\"ck.$final[$i].\"><label for=\"ck.$final[$i].\"> $final[$i]</label></td>";} //以下省略

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

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

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

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

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

guest

回答4

0

ベストアンサー

単に4個ずつテーブルにレイアウトしたいだけですか?

$final=range(0,13); print "<table border>"; for ($i=0; $i <count($final) ; $i+=4) { print "<tr>"; for ($j=0; $j <4 ; $j++) { echo "<td style=\"width:200px;\" >"; if(isset($final[$i+$j])){ $val=$final[$i+$j]; echo "<input type=\"checkbox\" name=\"asset\" value=\"".$val."\" id=\"ck".$val."\"><label for=\"ck".$val."\">".$val."</label>"; }else{ echo "&nbsp;"; } echo "</td>"; } print "</tr>"; } print "</table>";

投稿2016/11/02 06:10

yambejp

総合スコア114581

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

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

SugiuraY

2016/11/02 06:42

ご回答有難うございます。 また、言葉足らずにかかわらずお汲み取り頂き有難うございました。 $val=$final[$i+$j];の発送が私にはなかったです、、、 大変勉強になりました。 宜しくお願い申しあげます。
guest

0

質問のタイトルにある「ネスト」ですが、今回の質問のコードはネストではなく単に縦に並べただけです。

for文のネストとは

php

1for($i=0;$i<10;$i++) 2{ 3 for($j=0;$j<10;$j++) 4 { 5 for($k=0;$k<10;$k++) 6 { 7 // 処理 8 } 9 } 10} 11

のようなものを指します。質問のソースではfor文を分けている意味がわかりませんが、どうされたいですか?

質問のソースでは下記と等価に見受けられます

php

1for ($i=0; $i <12 ; $i++) { 2}

###追記

たとえば$finalが2次元配列になっていてサイズが$final[4][8]だったとすると

php

1for($i=0; $i<4; $i++) 2{ 3 for($j=0; $j<8; $j++) 4 { 5echo "<td style=\"width:200px;\" ><input type=\"checkbox\" name=\"asset\" value=\".$final[$i][$j].\" id=\"ck.$final[$i][$j].\"><label for=\"ck.$final[$i][$j].\"> 6 $final[$i][$j]</label></td>";} 7 } 8}

というような時にネストします

数が非常にいい多いため、これをfor文を入れ子にすることにより

数が多くても今回の場合ソースを見る限りネストにするメリットはないと思いますが。。。

追記

for($i=0; $i<16628; $i+=4){ echo("<tr>"); for($j=0; $j<4; $j++) { if(isset($final[$i + $j])) echo "<td style=\"width:200px;\" ><input type=\"checkbox\" name=\"asset\" value=\".$final[$i + $j].\" id=\"ck.$final[$i + $j].\"><label for=\"ck.$final[$i + $j].\">$final[$i + $j]</label></td>";} else echo("<td></td>"); } echo("<tr>"); }

投稿2016/11/02 05:50

編集2016/11/02 06:28
hiim

総合スコア1689

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

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

SugiuraY

2016/11/02 06:11

ご回答有難うございます。 例えば、以下まで$iがある場合、このfor文コードのかたまりを8314回(16628/4)こぴぺする ことになってしまという意図で申し上げました。誤認があれば申し訳ございません。 for ($i=16624; $i <16628 ; $i++) { echo "<td style=\"width:200px;\" ><input type=\"checkbox\" name=\"asset\" value=\".$final[$i].\" id=\"ck.$final[$i].\"><label for=\"ck.$final[$i].\"> $final[$i]</label></td>";}
hiim

2016/11/02 06:31 編集

もしかして、<td></td><td></td><td></td><td></td>を <tr><td></td><td></td><td></td><td></td></tr>のようにtrではさんで8314段のテーブルにしたいという事ですか? もしそうであれば、ネストは2重、で外側のカウンタを$i、内側のカウンタを$jとして$iは4つ飛ばしに進めていく、内側のfor文の前後で<tr>と、</tr>を出力し、内側のfor文の内での$finalのindexは$i+$jとして書く、 もしくは for ($i=0; $i <16628 ; $i++) の中で、$i%4が0なら<tr>出力するなどして<tr></tr>をtd4つ文ごとにいれていくかですね ソース追記しました 内側の配列へのindex間違ってましたので修正しました
SugiuraY

2016/11/02 06:44

ご回答を頂、有難うございます。 仰るとおりのところが目的で、無事達成することができました。 深謝申し上げます。
guest

0

もしかしてやりたいのはこんな感じの事でしょうか?

php

1for ($i = 0; $i < $total; $i += 4) { // 4つ飛ばしの起点 2 for ($j = 0; $j < 4; $j++) { // 4つずつ1区切りで繰り返し 3 $k = $i + $j; // $iと$jから本来の場所を求める 4 if ($k < $total) { // $final[]の範囲を越えないように安全判定 5 $val = $final[$k]; // $final[]の内容を参照 6 } else { 7 break;// $final[]の範囲を越えたら終了(端数対応のため) 8 } 9 } 10} 11

投稿2016/11/02 06:24

HiroshiWatanabe

総合スコア2160

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

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

0

for ($i=0; $i <4 ; $i++) { for ($j=0; $j <4 ; $j++) {

で、[$i*4+$j] が目指す、4つ飛ばしの0-3,4-7,8-11 のインデックスです。

投稿2016/11/02 05:54

akio221

総合スコア716

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

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

SugiuraY

2016/11/02 06:43

ご回答いただきありがとうございます。無事意図通りのコードを書くことができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問