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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

5回答

481閲覧

【PHP】配列のkeyとValueでテーブルを作成したい

sakura8689

総合スコア13

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2019/02/26 11:05

編集2019/02/26 11:34

お世話になっております。
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ページで確認できます。

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

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

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

退会済みユーザー

退会済みユーザー

2019/02/26 11:22

どのあたりがわからないのかを質問文に記載していただけますか? 既にご自分で調べた内容や試したことがあると思いますので、質問文への追記をお願いします。
guest

回答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;

イメージ説明
同じデータで$row_point = 3;
イメージ説明
同じデータで$row_point = 5;
イメージ説明

投稿2019/02/26 12:52

編集2019/02/26 13:22
m.ts10806

総合スコア80765

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

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

sakura8689

2019/02/27 00:24

mts10806さん 本当にご丁寧にご回答ありがとうございます。奇数時の処理も含めてご返答頂いた内容を元に解析させて頂き処理に反映したいと思います。
m.ts10806

2019/02/27 00:53

私の回答はあくまでロジックと思ってください。 何かを実現するときの検証のしかた。 ミニマムコードで試して徐々に当てはめて徐々に調整していく。 実は「その変数の数値をいじりながら出力結果を見て調整した結果」のコードが一番時間がかかってます。 そのあたりまで伝えられればいいのですが、回答欄では伝えきれないものとしてコードを提示するだけに留めました。 しかしながら、色々なデータを投入してきちんと想定通り動くかの確認は必須なので、その上で不都合な結果が出れば調整していく、という感じですね。(この過程が楽しめるようになればいい技術者になれます)
m.ts10806

2019/02/27 01:26

ちなみに「処理に反映する」とおっしゃっていますが、既にご自身で「データを処理で扱いやすい形態にする」方向に舵を切られているので、私の回答を取り込むのはかえってグチャグチャになります。データ側で対応するようにしてください。半端は良くないです。 あくまで質問の状態のデータを処理でやった場合のやり方です。
guest

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

yambejp

総合スコア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

sakura8689

総合スコア13

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

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

m.ts10806

2019/02/26 12:54

確かに「出力しやすい形にデータをかえる」というのはあると思います。 データがデータベースにある場合、SELECTするときにHTML出力想定結果に近い形のデータを作っておく、とかですね。 ひとまず「並列的なデータだった場合の対応」で回答してみましたので、参考にしてみてください。
m.ts10806

2019/02/26 12:55

ただ、それだと2列出すとして偶数ならいいですが奇数の場合は空の配列が作る必要があるので、そこをコスト高いと考えるかどうかが争点ですね。
sakura8689

2019/02/27 00:16

mts10806さん ご解答ありがとうございます! 今回は仕様でこちら側で出力項目数をハンドルリングする事ができ、吐き出される項目数として『偶数である』という縛りをつけてしまいました。ただ、これではご指摘のある通り奇数の場合にコストが高くあまり汎用性ではない処理なので頂いたご返答を元を自分なりに解析して処理に反映したいと思います。
guest

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

ところで、どのあたりがWordPress関連なのでしょうか?
m.ts10806

2019/02/26 11:46

thをtdに変えただけでは。 そういうことじゃないですよ、これ。
退会済みユーザー

退会済みユーザー

2019/02/28 05:32

mts10806さん 勘違いされているようですが、質問者さんが質問文にコードを記載したのは、私の回答の後ですよ。
m.ts10806

2019/02/28 05:38

確かにそうですね。そこは失礼しました。 ただ、画像は最初からあがっているようなので、 提示の仕方では画像の通りにはならないと思います。
退会済みユーザー

退会済みユーザー

2019/02/28 05:41

mts10806さん > 提示の仕方では画像の通りにはならないと思います。 はい、そうですね。 質問文には具体的なコードが一切書かれていなかったので、そもそも配列をforeachで回す方法はわからないのではないかと思っての回答でした。
退会済みユーザー

退会済みユーザー

2019/02/28 05:45

まあ、風呂に入りながら、スマホからポチポチ打ったコードなので、今確かめると全角スペースが混ざってしまっているエラーコードですから、悪いコードなのは確かですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問