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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

7551閲覧

多次元配列をHTMLのtableタグで表にする。

noobmaster69

総合スコア2

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2021/10/12 09:17

この多次元配列の内容をhtmlのtableタグを使用して以下の様に表示させる問題なのですがうまくいきません。
具体的には一列目にキーであるr1,r2,r3,縦合計を入れられません。

<?php $arr = [ 'r1' => ['c1' => 10, 'c2' => 5, 'c3' => 20], 'r2' => ['c1' => 7, 'c2' => 8, 'c3' => 12], 'r3' => ['c1' => 25, 'c2' => 9, 'c3' => 130] ]; ?>

前提・実現したいこと


  • |_____|_c1|_c2|_c3|横合計|
  • |___r1|_10|__5|_20|___35|
  • |___r2|__7|__8|_12|___27   |
  • |___r3|_25|__9|130|__164|
  • |縦合計|_42|_22|162|__226|
  • ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾

該当のソースコード

PHP

試したこと

<?php echo "<table border='1'><tr>"; echo "<thred>"; echo "<tr>"; echo "<th></th>"; echo "<th>c1</th>"; echo "<th>c2</th>"; echo "<th>c3</th>"; echo "<th>横合計</th>"; echo "</tr>"; echo "</thred>"; foreach($arr['r1'] as $key => $val) { echo "<tr><td>". "r1</td><td>" . $val . "</td></tr>"; } foreach($arr['r2'] as $key => $val) { echo "<tr>". $key . "</tr><td>" . $val . "</td>"; } foreach($arr['r3'] as $key=> $val) { echo "<tr>". $key . "</tr><td>" . $val . "</td>"; } echo "</table></tr>"; ?>

この様に「多次元配列 table」、「foreach table」など検索しながらコードを作りました。
言い訳になってしまいますが、自学でやっておりコードかなり見にくいとは思いますが、ご回答よろしくお願いいたします。

ここに問題に対して試したことを記載してください。

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

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

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

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

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

guest

回答3

0

配列関数を使わずに計算するならこんなかんじでしょか。

php

1<?php 2// Your code here! 3$arr = [ 4'r1' => ['c1' => 10, 'c2' => 5, 'c3' => 20], 5'r2' => ['c1' => 7, 'c2' => 8, 'c3' => 12], 6'r3' => ['c1' => 25, 'c2' => 9, 'c3' => 130] 7]; 8 9$tate = ['c1'=>0, 'c2'=>0, 'c3'=>0]; 10$all = 0; 11foreach ($arr as $k=>$row) { 12 $yoko = 0; 13 echo "<tr><td>" . $k . "</td>"; 14 foreach($row as $key=>$val) { 15 echo "<td>" . $val . "</td>"; 16 $yoko += $val; 17 $tate[$key] += $val; 18 } 19 echo "<td>" . $yoko . "</td></tr>"; 20 $all += $yoko; 21} 22echo "<tr><td>縦合計</td>"; 23foreach ($tate as $c=>$v) { 24 echo "<td>" . $v . "</td>"; 25} 26echo "<td>" . $all . "</td></tr>"; 27?>

投稿2021/10/12 11:43

takasima20

総合スコア7464

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

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

m055001

2021/10/13 07:10 編集

横のヘッダーがなかったので追加してみました! <?php // Your code here! $arr = [ 'r1' => ['c1' => 10, 'c2' => 5, 'c3' => 20], 'r2' => ['c1' => 7, 'c2' => 8, 'c3' => 12], 'r3' => ['c1' => 25, 'c2' => 9, 'c3' => 130] ]; $tate = ['c1'=>0, 'c2'=>0, 'c3'=>0]; $all = 0; echo "<table border='1'>"; echo "<tr><td></td><td>c1</td><td>c2</td><td>c3</td><td>横合計</td>"; foreach ($arr as $k=>$row) { $yoko = 0; echo "<tr><td>" . $k . "</td>"; foreach($row as $key=>$val) { echo "<td>" . $val . "</td>"; $yoko += $val; $tate[$key] += $val; } echo "<td>" . $yoko . "</td></tr>"; $all += $yoko; } echo "<tr><td>縦合計</td>"; foreach ($tate as $c=>$v) { echo "<td>" . $v . "</td>"; } echo "<td>" . $all . "</td></tr>"; echo "</table>"; ?>
guest

0

ベストアンサー

もっとシンプルに書けますが、回答のスピード重視で書いてみました
HTMLを位置行ごとにechoしないといけないのであれば、そのように書き直していただければと思います

html

1<?php 2 $arr = [ 3 'r1' => ['c1' => 10, 'c2' => 5, 'c3' => 20], 4 'r2' => ['c1' => 7, 'c2' => 8, 'c3' => 12], 5 'r3' => ['c1' => 25, 'c2' => 9, 'c3' => 130] 6 ]; 7 8 // 行ごとの合計 9 $row_total = [ 10 'r1' => array_sum($arr['r1']), 11 'r2' => array_sum($arr['r2']), 12 'r3' => array_sum($arr['r3']), 13 ]; 14 15 // 列ごとの合計 16 $column_total = [ 17 'c1' => array_sum(array_column($arr, 'c1')), 18 'c2' => array_sum(array_column($arr, 'c2')), 19 'c3' => array_sum(array_column($arr, 'c3')), 20 ]; 21 22 // 全ての合計 23 $all_total = 0; 24 foreach ($column_total as $total) { 25 $all_total = $all_total + $total; 26 } 27?> 28 29<!DOCTYPE html> 30<html lang="ja"> 31<head> 32 <meta charset="UTF-8"> 33 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 34 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 35 <title>Document</title> 36</head> 37<body> 38 <table border="1"> 39 <thead> 40 <!-- 1行目 --> 41 <tr> 42 <th></th><th>c1</th><th>c2</th><th>c3</th><th>横合計</th> 43 </tr> 44 </thead> 45 <tbody> 46 <!-- 2〜4行目 --> 47 <?php foreach ($arr as $row_key => $row_arr) : ?> 48 <tr> 49 <!-- 行頭 --> 50 <td><?php echo $row_key ?></td> 51 52 <!-- 行の各数値 --> 53 <?php foreach ($row_arr as $key => $row_value) : ?> 54 <td><?php echo $row_value; ?></td> 55 <?php endforeach ?> 56 57 <!-- 行の合計 --> 58 <td><?php echo $row_total[$row_key]; ?></td> 59 </tr> 60 <?php endforeach ?> 61 <!-- 5行目 --> 62 <tr> 63 <!-- 行頭 --> 64 <td>縦合計</td> 65 66 <!-- 列ごとの郷駅 --> 67 <?php foreach ($column_total as $column_key => $total) : ?> 68 <td><?php echo $total; ?></td> 69 <?php endforeach ?> 70 71 <!-- 全ての合計 --> 72 <td><?php echo $all_total; ?></td> 73 </tr> 74 </tbody> 75 </table> 76</body> 77</html>

投稿2021/10/12 10:52

m055001

総合スコア72

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

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

noobmaster69

2021/10/12 11:09 編集

ありがとうございます! いまいち理解ができないのですが、echoは不要なのであれば付けないようにします。 よろしければ、for文を利用した記述方法も教えて頂きたいです。
m055001

2021/10/13 07:13

takasima20 さんの回答が短くてシンプルでいいと思いました!(一部足りない部分があったのでコメントで追記しました) foreach文ではなく、for文でしょうか? できなくはないですが、問で与えられている配列が連想配列なので、実際の開発ではわざわざfor文で作成するということはやらないんじゃないかなと思います。
noobmaster69

2021/10/14 00:56

ご回答ありがとうございます。 この問題とは別でfor文で解答する問題もあって、自分でも「連想配列、for文で表示」など調べたのですがわからず。 よろしければfor文でのコードも教えていただけないでしょうか。
m055001

2021/10/14 03:23

別回答でfor文も追加しました! どの部分がわからないか言ってもらったらできる限り回答しますよ
noobmaster69

2021/10/18 08:43

度々申し訳ございません。 教えていただいたコードを入力し、正常に表示されたのですが、分割して入力したところ正常に表示されなくなってしまいました。 以下入力内容を打ち込みます。 <?php // 以下配列の中身をfor文を使用して表示してください。 // 表示はHTMLの<table>タグを使用すること /** * 表示イメージ * _________________________ * |_____|_c1|_c2|_c3|横合計| * |___r1|_10|__5|_20|___35| * |___r2|__7|__8|_12|___27| * |___r3|_25|__9|130|__164| * |縦合計|_42|_22|162|__226| * ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ */ $arr = [ 'r1' => ['c1' => 10, 'c2' => 5, 'c3' => 20], 'r2' => ['c1' => 7, 'c2' => 8, 'c3' => 12], 'r3' => ['c1' => 25, 'c2' => 9, 'c3' => 130] ]; // 行ごとの合計 $row_total = [ 'r1' => array_sum($arr['r1']), 'r2' => array_sum($arr['r2']), 'r3' => array_sum($arr['r3']), ]; // 列ごとの合計 $column_total = [ 'c1' => array_sum(array_column($arr, 'c1')), 'c2' => array_sum(array_column($arr, 'c2')), 'c3' => array_sum(array_column($arr, 'c3')), ]; // 全ての合計 $all_total = 0; foreach ($column_total as $total) { $all_total = $all_total + $total; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>テーブル表示</title> <style> table { border:1px solid #000; border-collapse: collapse; } th, td { border:1px solid #000; } </style> </head> <body> <!-- ここにテーブル表示 --> <table> <? echo "<tr><td></td><td>c1</td><td>c2</td><td>c3</td><td>横合計</td></tr>"; // r1~r3の各値を表示 for ($i = 1; $i <= count($arr); $i++) { $row_key = "r{$i}"; echo "<tr><td>{$row_key}</td>"; for ($j = 1; $j <= count($arr[$row_key]); $j++) { $column_key = "c{$j}"; // r1~r3の各値を表示 echo "<td>{$arr[$row_key][$column_key]}</td>"; } // r1~r3の横合計を表示 echo "<td>{$row_total[$row_key]}</td></tr>"; } // c1〜c3の縦合計を表示 echo "<tr><td>縦合計</td>"; for ($j = 1; $j <= count($column_total); $j++) { $column_key = "c{$j}"; echo "<td>{$column_total[$column_key]}</td>"; } // 総合計を表示 echo "<td>{$all_total}</td></tr>"; ?> </table> </body> </html>
m055001

2021/10/18 09:47

<table>タグの直後、<? となってしまっていますが、 <?php とすれば正常に表示されるんじゃないかと思います!
guest

0

for文のパターンです。
こちらは全てechoする形で書きました

php

1<?php 2 3$arr = [ 4 'r1' => ['c1' => 10, 'c2' => 5, 'c3' => 20], 5 'r2' => ['c1' => 7, 'c2' => 8, 'c3' => 12], 6 'r3' => ['c1' => 25, 'c2' => 9, 'c3' => 130] 7]; 8 9// 行ごとの合計 10$row_total = [ 11 'r1' => array_sum($arr['r1']), 12 'r2' => array_sum($arr['r2']), 13 'r3' => array_sum($arr['r3']), 14]; 15 16// 列ごとの合計 17$column_total = [ 18 'c1' => array_sum(array_column($arr, 'c1')), 19 'c2' => array_sum(array_column($arr, 'c2')), 20 'c3' => array_sum(array_column($arr, 'c3')), 21]; 22 23// 全ての合計 24$all_total = 0; 25foreach ($column_total as $total) { 26 $all_total = $all_total + $total; 27} 28 29// ヘッダーを表示 30echo "<table border='1'>"; 31echo "<tr><td></td><td>c1</td><td>c2</td><td>c3</td><td>横合計</td></tr>"; 32 33// r1~r3の各値を表示 34for ($i = 1; $i <= count($arr); $i++) { 35 $row_key = "r{$i}"; 36 echo "<tr><td>{$row_key}</td>"; 37 for ($j = 1; $j <= count($arr[$row_key]); $j++) { 38 $column_key = "c{$j}"; 39 // r1~r3の各値を表示 40 echo "<td>{$arr[$row_key][$column_key]}</td>"; 41 } 42 // r1~r3の横合計を表示 43 echo "<td>{$row_total[$row_key]}</td></tr>"; 44} 45 46// c1〜c3の縦合計を表示 47echo "<tr><td>縦合計</td>"; 48for ($j = 1; $j <= count($column_total); $j++) { 49 $column_key = "c{$j}"; 50 echo "<td>{$column_total[$column_key]}</td>"; 51} 52 53// 総合計を表示 54echo "<td>{$all_total}</td></tr>"; 55 56echo "</table>"; 57?>

投稿2021/10/14 03:21

m055001

総合スコア72

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問