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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

Q&A

解決済

1回答

989閲覧

php foreachを使用してhtml tableへの表示

xx999

総合スコア5

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

0グッド

0クリップ

投稿2020/01/14 07:24

編集2020/01/14 08:17

前提・実現したいこと

シフト表を作成しています。
DBからsqlで取得した配列を希望のhtmlに表示できません。
日付、名前を元に出退勤時間を縦に表示したいです。

該当のソースコード

array(2) { ["田中"]=> array(2) { [0]=> array(5) { ["user_id"]=> string(1) "1" ["user_name"]=> string(6) "田中" ["start"]=> string(5) "08:00" ["last"]=> string(5) "18:00" ["date"]=> string(10) "2019/01/01" } [1]=> array(5) { ["user_id"]=> string(1) "1" ["user_name"]=> string(6) "田中" ["start"]=> string(5) "08:00" ["last"]=> string(5) "18:00" ["date"]=> string(10) "2019/01/02" } } ["佐藤"]=> array(2) { [0]=> array(5) { ["user_id"]=> string(1) "2" ["user_name"]=> string(6) "佐藤" ["start"]=> string(5) "08:00" ["last"]=> string(5) "18:00" ["date"]=> string(10) "2019/01/01" } [1]=> array(5) { ["user_id"]=> string(1) "2" ["user_name"]=> string(6) "佐藤" ["start"]=> string(5) "08:00" ["last"]=> string(5) "18:00" ["date"]=> string(10) "2019/01/02" } } }

上記を下記のように表示させたいです。

<table border="1"> <tr> <td>日付</td><td>田中</td><td>佐藤</td> </tr> <tr> <td>2019/01/01</td><td>08:00~18:00</td><td>08:00~18:00</td> </tr> <tr> <td>2019/01/02</td><td>08:00~18:00</td><td>08:00~18:00</td> </tr> </table>

発生している問題・エラーメッセージ

横に表示となってしまう <table border="1"> <tr> <td>日付</td> <?php foreach ($hoge as $key => $value): ?> <td><?=$key?></td> <?php endforeach; ?> </tr> <tr> <?php foreach ($hoge as $key => $value): ?> <?php foreach ($value as $key2 => $value2): ?> <td><?=$value2["date"]?></td><td><?=$value2["start"]?>~<?=$value2["last"]?></td> <?php endforeach; ?> <?php endforeach; ?> </tr> </table>

配列作成時点で誤りがあるのかhtml tableへの表示方法などございましたらご教授頂けますと幸いです。
宜しくお願いします。

補足情報(FW/ツールのバージョンなど)

win10
PHP 7.2.9

追記

// user_idとuser_nameのDBテーブル $sql = "SELECT `user_name`, `user_id` FROM `user_data`"; $stmt = $db->query($sql); foreach ($stmt as $row) { $user_data[] = array( 'user_id' => $row['user_id'], 'user_name' => $row['user_name'], );} // user_idと出退勤情報のdbテーブル $sql = "SELECT `user_id`,`date`,`start`,`last`FROM `input_data2`"; $stmt = $db->query($sql); foreach ($stmt as $row) { $syukkin_data[] = array( 'user_id' => $row['user_id'], 'date' => $row['date'], 'start' => $row['start'], 'last' => $row['last'], );}
// 2つのdbテーブルからuser_idをもとに表示用の配列を作成 foreach ($user_data as $key => $value) { foreach ($syukkin_data as $key2 => $value2) { if($value['user_id'] == $value2['user_id']){ $hoge[$value['user_name']][] =array( 'user_id' => $value2['user_id'], 'date' => $value2['date'], 'start' => $value2['start'], 'last' => $value2['last'], 'user_name' => $value['user_name'], ); } } } // var_export(hoge); array ( '田中' => array ( 0 => array ( 'user_id' => '1', 'date' => '2020-01-01', 'start' => '08:00', 'last' => '18:00', 'user_name' => '田中', ), 1 => array ( 'user_id' => '1', 'date' => '2020-01-02', 'start' => '08:00', 'last' => '18:00', 'user_name' => '田中', ), ), '佐藤' => array ( 0 => array ( 'user_id' => '2', 'date' => '2020-01-01', 'start' => '08:00', 'last' => '18:00', 'user_name' => '佐藤', ), 1 => array ( 'user_id' => '2', 'date' => '2020-01-01', 'start' => '08:00', 'last' => '18:00', 'user_name' => '佐藤', ), ),

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

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

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

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

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

m.ts10806

2020/01/14 07:28

データを取得する部分のコードとDBのテーブル定義、サンプルデータをそれぞれご提示ください
m.ts10806

2020/01/14 07:48 編集

あと配列の内容提示される場合はvar_exportのほうがありがたいです。 ※細かいですが質問によって教えをこう場合は「ご教示」です
xx999

2020/01/14 08:08

m.ts10806様 ご指摘ありがとうございます。不十分で申し訳ありません。 追記致しましたがこちらの情報で宜しいでしょうか。 宜しくお願い致します。
guest

回答1

0

ベストアンサー

データの持ち方が冗長ですね。たとえばこんな感じ

投稿2020/01/14 08:04

yambejp

総合スコア114585

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

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

yambejp

2020/01/14 08:08

$a=[ "田中"=>[ [ "user_id"=> "1", "user_name"=> "田中", "start"=> "08:00", "last"=> "18:00", "date"=> "2019/01/01", ], [ "user_id"=> "1", "user_name"=> "田中", "start"=> "08:00", "last"=> "18:00", "date"=> "2019/01/02", ], ], "佐藤"=>[ [ "user_id"=> "2", "user_name"=> "佐藤", "start"=> "08:00", "last"=> "18:00", "date"=> "2019/01/01", ], [ "user_id"=> "2", "user_name"=> "佐藤", "start"=> "08:00", "last"=> "18:00", "date"=> "2019/01/02", ], ], ];
yambejp

2020/01/14 08:08

$dates=[]; array_walk($a,function($x) use(&$dates){ $dates=array_merge($dates,$x); }); $dates=array_unique(array_map(function($x){ return $x["date"]; },$dates)); $users=array_keys($a); print "<table border>"; print "<tr>"; print "<td>日付</td>"; foreach($users as $user){ print "<td>{$user}</td>"; } print "</tr>"; foreach($dates as $date){ print "<tr>"; print "<td>".$date."</td>"; foreach($users as $user){ $d=($d=array_values(array_filter($a[$user],function($x) use($date){ return $x["date"]==$date; })))?$d[0]:null; print "<td>"; print count($d)>0?"{$d["start"]}~{$d["last"]}":""; print "</td>"; } print "</tr>"; } print "</table>";
xx999

2020/01/14 09:57

yambejp様 ありがとうございます。 ご指摘の配列について最適化できるよう再度見直してみます。 今後に生かすことができるよう教えて頂いたコードについて深めていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問