この多次元配列の内容をhtmlのtableタグを使用して以下の様に表示させる問題なのですがうまくいきません。
具体的には一列目にキーであるr1,r2,r3,縦合計を入れられません。
前提・実現したいこと
-
- |_____|_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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア7464
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/13 07:10 編集
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
総合スコア72
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/12 11:09 編集
2021/10/13 07:13
2021/10/14 00:56
2021/10/14 03:23
2021/10/18 08:43
2021/10/18 09:47
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
総合スコア72
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。