お世話になっております。
PHPで、以下の配列を
$nArray = array( 見出し1 => コンテンツ1, 見出し2 => コンテンツ2, 見出し3 => コンテンツ3, 見出し4 => コンテンツ4 )
下記のような形でテーブルとして出したいのですが、
どのようなコードになりますでしょうか。
現状、以下のような形で単純にテーブルにkey値と、$value値を出力されることはできました。
<table> <?php foreach ($nArray as $key => $value): ?> <tr> <th><?php echo $key;?></th> <td><?php echo $value;?></td> </tr> <?php endforeach; ?> </table>
key値と$value値をtrの中に複数(2つづつ)出したいのですが、ループの仕方が不明で…。
質問下手くそで申し訳ありません。
お手数をお掛け致しますがご教授頂けると助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
こういう対応する場合、私は、まずは静的HTMLでゴールを作ってそれを目指していきます。
たぶんこんな感じ。
html
1<table> 2 <tr> 3 <th>1</th> 4 <td>a</td> 5 <th>2</th> 6 <td>b</td> 7 </tr> 8 <tr> 9 <th>3</th> 10 <td>c</td> 11 <th>4</th> 12 <td>d</td> 13 </tr> 14 <tr> 15 <th>5</th> 16 <td>e</td> 17 <th></th> 18 <td></td> 19 </tr> 20</table>
最後、奇数になると埋める必要があると思ったので空の組みを1つ出しています。
ここで法則を見つけ出します。th-tdの組が2回あったあとにtrが閉められています。
それを実現すればいいわけですね。
「ループの回数が偶数であればtr閉め」となりますが、PHPに限らずに使われるのが余りを出す%を使った方法です。
「偶数」の場合は対象の値を%2とします。
ミニマムコード:
php
1for($i=0;$i<10;$i++){ 2 if($i%2===1){ 3 echo $i; 4 } 5} 6//13579
これを応用して、いきます。
第1段階
php
1<table> 2 <?php 3 $i=0; 4 $th_tr_group = ""; 5 foreach ($nArray as $key => $value){ 6 $th_tr_group .=" 7 <th>{$key}</th> 8 <td>{$value}</td>\n"; 9 if($i%2===1){ 10 echo "<tr>{$th_tr_group}</tr>\n"; 11 $th_tr_group = ""; 12 } 13 $i++; 14 } 15?> 16</table>
実は、
このコードには1点問題があり、「奇数個データがあったときにそこが出力されない」という問題があります。
偶数のときにしかechoしていないためですね。
ここを「余ってたら出す」ようにする必要があります。
foreachなどループの関数には特性があり、「明示的にその変数をOFFにしない限り最後の値が残っている」となります。
ので、第2段階としては下記
php
1<table> 2 <?php 3 $i=0; 4 $th_tr_group = ""; 5 foreach ($nArray as $key => $value){ 6 $th_tr_group .=" 7 <th>{$key}</th> 8 <td>{$value}</td>\n"; 9 if($i%2===1){ 10 echo "<tr>{$th_tr_group}</tr>\n"; 11 $th_tr_group = ""; 12 } 13 $i++; 14 } 15echo "<tr> 16 <th>{$key}</th> 17 <td>{$value}</td> 18 <th></th> 19 <td></td> 20</tr>"; 21?> 22</table>
ブラウザで見たとき
※テスト用の配列を0開始で作ってる関係で0が最初に来ています。
ただ、これにも問題があります。
「2じゃなくて3とかにしたい」となった場合に、書き換えが必要となります。
もう少しそこを汎用的に作ります。
先ほどの「明示的にその変数をOFFにしない限り最後の値が残っている」というのと
「tr閉じられないときは$th_tr_groupがリセットされていない」というのを利用します。
あとは「データ何個で折り返すか」変数を作り、上記までの対応を利用し、
その変数の数値をいじりながら出力結果を見て調整した結果、下記のような感じです。
php
1<?php 2$row_point = 2; 3?> 4<table> 5 <?php 6 7 $i=0; 8 $th_tr_group = ""; 9 foreach ($nArray as $key => $value){ 10 $th_tr_group .=" 11 <th>{$key}</th> 12 <td>{$value}</td>\n"; 13 if($i%$row_point>=($row_point-1)){ 14 echo "<tr>{$th_tr_group}</tr>\n"; 15 $th_tr_group = ""; 16 } 17 $i++; 18 } 19 if($i%$row_point>=1){ 20 for($r=0;$r<($i%$row_point);$i++){//余りを空で埋める 21 $th_tr_group .=" 22 <th></th> 23 <td></td>\n"; 24 } 25 echo "<tr>{$th_tr_group}</tr>\n"; 26 } 27?> 28</table>
※結果は同じ。
$row_pointの値を変えるだけで1行の個数が変化し、残りを空で埋めるようになっています。
ちなみに、2,3は割と簡単ですが、4以上の調整に結構時間かかります。
$row_pointを3にしたとき(HTML出力結果)
html
1<table> 2 <tr> 3 <th>0</th> 4 <td>a</td> 5 6 <th>1</th> 7 <td>b</td> 8 9 <th>2</th> 10 <td>c</td> 11</tr> 12<tr> 13 <th>3</th> 14 <td>d</td> 15 16 <th>4</th> 17 <td>e</td> 18 19 <th></th> 20 <td></td> 21</tr> 22</table>
4にしたとき
html
1<table> 2 <tr> 3 <th>0</th> 4 <td>a</td> 5 6 <th>1</th> 7 <td>b</td> 8 9 <th>2</th> 10 <td>c</td> 11 12 <th>3</th> 13 <td>d</td> 14</tr> 15<tr> 16 <th>4</th> 17 <td>e</td> 18 19 <th></th> 20 <td></td> 21 22 <th></th> 23 <td></td> 24 25 <th></th> 26 <td></td> 27</tr> 28</table>
5にしたとき
html
1<table> 2 <tr> 3 <th>0</th> 4 <td>a</td> 5 6 <th>1</th> 7 <td>b</td> 8 9 <th>2</th> 10 <td>c</td> 11 12 <th>3</th> 13 <td>d</td> 14 15 <th>4</th> 16 <td>e</td> 17</tr> 18</table>
6にしたとき
html
1<table> 2 <tr> 3 <th>0</th> 4 <td>a</td> 5 6 <th>1</th> 7 <td>b</td> 8 9 <th>2</th> 10 <td>c</td> 11 12 <th>3</th> 13 <td>d</td> 14 15 <th>4</th> 16 <td>e</td> 17 18 <th></th> 19 <td></td> 20</tr> 21</table> 22
参考まで。
※HTMLコードのインデントなどはとりあえず無視で、結果出力だけあわせました。
インデントあわせたい場合はご自身で調整してください。
蛇足:
テストでたくさんデータを作ってみる。
php
1$nArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]; 2$row_point = 6;
php
1$nArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]; 2$row_point = 2;
投稿2019/02/26 12:52
編集2019/02/26 13:22総合スコア80765
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/27 00:24
2019/02/27 00:53
2019/02/27 01:26
0
chunkして最後の要素のあまりをnullで埋めればいいのでは?
PHP
1$cols=3; 2$a = [ 3 "見出し1" => "コンテンツ1", 4 "見出し2" => "コンテンツ2", 5 "見出し3" => "コンテンツ3", 6 "見出し4" => "コンテンツ4", 7 "見出し5" => "コンテンツ5", 8]; 9$b=array_chunk($a,$cols); 10$c=array_fill(0,$cols-count($b[count($b)-1]),NULL); 11$b[count($b)-1]=array_merge($b[count($b)-1],$c); 12 13print_r($b); 14
投稿2019/02/28 06:08
総合スコア114583
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
table タグで並べるデータでは無いような気がします。
css で並べてあげるのが適切かと。
投稿2019/02/26 13:47
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自己解決
普通の配列では無理なので、データの生成の仕方を以下に変えました。
$nArray = array( 見出し1 => コンテンツ1, 見出し2 => コンテンツ2, 見出し3 => コンテンツ3, 見出し4 => コンテンツ4 )
だったものを
$nArray = array( array( 見出し1 => コンテンツ1, 見出し2 => コンテンツ2, ), array( 見出し3 => コンテンツ3, 見出し4 => コンテンツ4, ), )
としました。
内部的な話をすると、カスタムフィールドから値をとってきて
配列としていました。
単純な配列では無理でしたので、連想配列?にして、以下のような形で吐き出させさせました。
<?php foreach($nArray as $row): ?> <tr> <?php foreach($row as $key => $cel): ?> <td><?= $key ?></td> <td><?= $cel ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?>
今回は大変わかりにくい質問ですいませんでした。自己解決しましたので記載しておきます。
もっとスマートなやり方をご存知の方いらっしゃいましたらご教示頂ければと思います。
投稿2019/02/26 12:07
総合スコア13
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/26 12:54
2019/02/26 12:55
2019/02/27 00:16
0
PHP
1echo "<table>"; 2foreach($nArray as $key => $val) 3{ 4 echo "<tr><td>" . $key . "</td><td>" . $val . "</td></tr>"; 5} 6echo "</table>";
投稿2019/02/26 11:30
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/02/26 11:32
2019/02/26 11:46
退会済みユーザー
2019/02/28 05:32
2019/02/28 05:38
退会済みユーザー
2019/02/28 05:41
退会済みユーザー
2019/02/28 05:45
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。