多次元配列から作った表の重複行をまとめたい

このQ&Aのポイント
  • データベースから特定期限のデータを取得し、多次元配列から表を作成しました。
  • しかし、同じIDと名前の行が複数存在し、それらをひとつにまとめたいです。
  • 質問のコードを使用して、同じIDと名前の行をマージする方法を教えてください。
回答を見る
  • ベストアンサー

多次元配列から作った表の重複行をまとめたい

データベースからある期限(14年3月21日から3月30日)で取得した下記の多次元配列から日付に該当するデータがあればセルに値を入れて表を作ったのですが、 <?php $cal=array( array("type" => 19, "name" => "山田", "hour" => 5, "day" => 2014-03-21), array("type" => 19, "name" => "山田", "hour" => 8, "day" => 2014-03-24), array("type" => 19, "name" => "山田", "hour" => 8, "day" => 2014-03-26), array("type" => 19, "name" => "田中", "hour" => 8, "day" => 2014-03-23), array("type" => 19, "name" => "田中", "hour" => 8, "day" => 2014-03-26), array("type" => 19, "name" => "田中", "hour" => 3, "day" => 2014-03-28), array("type" => 20, "name" => "大田", "hour" => 3, "day" => 2014-03-21), array("type" => 20, "name" => "大田", "hour" => 5, "day" => 2014-03-27), array("type" => 20, "name" => "田中", "hour" => 3, "day" => 2014-03-24), array("type" => 20, "name" => "田中", "hour" => 4, "day" => 2014-03-27), array("type" => 0, "name" => "高橋", "hour" => 1, "day" => 2014-03-27), ); ?> <?php foreach ( $cal as $val ) : ?> <tr> <td><?php echo $val['type']; ?></td> <td><?php echo $val['name']; ?></td> <?php for ( $i = 21; $i <= 30; $i ++ ) : ?> <td> <?php if ( $day == $i ) { echo $val['hour']; } ?> </td> <?php endfor; ?> </tr> <?php endforeach; ?> 同じIDと名前の行が複数あり、同じIDと名前の行をひとつにしたいのです(画像参照)がわからず質問させていただきました。よろしくお願い致します。

  • F82CD
  • お礼率100% (1/1)
  • PHP
  • 回答数1
  • ありがとう数11

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ちょっと微妙なかんじですが、sql側で集計したものを表示した方がはやくないですか? //元データ create table tbl(type int,name varchar(20),hour int,day date); insert into tbl values(19,"山田",5,"2014-03-21") ,(19,"山田",8,"2014-03-24") ,(19,"山田",8,"2014-03-26") ,(19,"田中",8,"2014-03-23") ,(19,"田中",8,"2014-03-26") ,(19,"田中",3,"2014-03-28") ,(20,"大田",3,"2014-03-21") ,(20,"大田",5,"2014-03-27") ,(20,"田中",3,"2014-03-24") ,(20,"田中",4,"2014-03-27") ,(0,"高橋",1,"2014-03-27"); //集計 select type,name ,sum(hour*(day='2014-03-21')) as '0321' ,sum(hour*(day='2014-03-22')) as '0322' ,sum(hour*(day='2014-03-23')) as '0323' ,sum(hour*(day='2014-03-24')) as '0324' ,sum(hour*(day='2014-03-25')) as '0325' ,sum(hour*(day='2014-03-26')) as '0326' ,sum(hour*(day='2014-03-27')) as '0327' ,sum(hour*(day='2014-03-28')) as '0328' from tbl group by type,name;

F82CD
質問者

お礼

selet文でここまで集計できることがわかりませんでした。 教えていただきありがとうございました!

関連するQ&A

  • 配列が受け取れないのはなぜなのでしょうか?

    カレンダーの日付にリンクをさせようとしているのですが、上手くできません。 リンクさせたい日付をforeachで配列として渡そうと思うのですが、 受け取ってくれません。 なぜ、受け取ることができないのでしょうか? 何が間違っているのでしょうか。 どなたかご指摘、アドバイスなどお願いします。 以下コードです。 <?php $qry = $_SERVER['QUERY_STRING']; if( ereg( "^[0-9]{8}", $qry ) ){ $today = getdate( mktime( 0, 0, 0, substr( $qry,4,2 ), substr( $qry,6,2 ), substr( $qry,0,4 ) ) ); }else{ $today = getdate(); } $f_today = getdate( mktime( 0, 0, 0, $today[mon], 1, $today[year] ) ); $prev_month = date( "Ymd", mktime( 0, 0, 0, $today[mon], 0, $today[year] ) ); $next_month = date( "Ymd", mktime( 0, 0, 0, $today[mon]+1, 1, $today[year] ) ); <table width=170><tr><td> <table width=100%> <tr><td colspan=7><a href="?<?= $prev_month ?>">≪ </a><?= $today[year] ?>年<?= $today[mon] ?>月 <a href="?<?= $next_month ?>"> ≫</a></td></tr> <tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr> <tr> <?php for ( $i=0; $i<$f_today[wday]; $i++ ) { echo "<td></td>\n"; } $day = 1; while( checkdate( $today[mon], $day, $today[year] ) ){ $link = sprintf( "%4d%02d%02d", $today[year], $today[mon], $day ); if( $link == 20081014 ){ //← 日付を指定※ここが問題の箇所です。 echo "<td><a href=?date=$link\">$day</a></td>\n"; }else{ echo "<td>$day</td>\n"; } if( $f_today[wday] == 6) echo "</tr><tr>"; $day++; $f_today[wday]++; $f_today[wday] = $f_today[wday] % 7; } if( $f_today[wday] > 0 ){ while( $f_today[wday] < 7 ) { echo "<td> </td>\n"; $f_today[wday]++; } } else { echo "<td colspan=7></td>\n"; } ?> </tr> </table> </td></tr></table> 下記のように日付を配列にするとダメです。 $day = 1; //以下を変更 $data = array( "200810005", "200810010", "20081011", "20081015", "20081025", "20081030" ); foreach( $data as $value ) { $val = $value; while( checkdate( $today[mon], $day, $today[year] ) ){ $link = sprintf( "%4d%02d%02d", $today[year], $today[mon], $day ); if( $link == $val ){  // ← 配列で代入※配列として受け取ってくれない。 echo "<td><a href=?date=$link\">$day</a></td>\n"; }else{ echo "<td>$day</td>\n"; } if( $f_today[wday] == 6) echo "</tr><tr>"; $day++; $f_today[wday]++; $f_today[wday] = $f_today[wday] % 7; } } ↑ここまで なぜ、できないのかが分からないので、色々試しても上手くいきません。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • テーブルデータ表示

    mysqlからデータをphpで取得し以下のような多次元配列になっています。 Array ( [0] => Array ( [id] => 116 [name] => あああ ) [1] => Array ( [id] => 58 [name] => いいい ) [2] => Array ( [id] => 89 [name] => ううう ) ) 単純にデータを表示させたく以下のようにしましたが<th>$key2</th>の箇所が上記配列の場合 2回繰り返されて表示されてしまいます。ここはフィールド名なので1回の表示でいいのですが どのように記述すれば思うような表示になるでしょうか? echo "<table border=\"1\">"; echo "<tr>"; foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; //フィールド名 } } echo "</tr>"; foreach ($tmp1 as $key => $val) { echo "<tr>"; foreach ($val as $key2 => $val2) { echo "<td>" . $val2 . "</td>"; // 取得したデータをある分だけ繰り返し } echo "</tr>"; } echo "</table>";

    • ベストアンサー
    • PHP
  • PHPのヒアドキュメントの中で多次元配列

    PHP4を用いているのですが、ヒアドキュメントの中で多次元配列が思うとおりに展開されずに困っています。 echo <<<EOM <tr> <td>$req_list_array[$j]['Req_local']</td> <td>$req_list_array[$j]['Req_point']</td> <td>$req_list_array[$j]['User_name']</td> <td>$req_list_array[$j]['Req_time']</td> </tr> EOM; 上記のように打っても、 Array['Req_local'] Array['Req_point'] Array['User_name'] Array['Req_time'] と表示されてしまいます。 うまい解決方法をご存知の方よろしくお願いします。 ${req_list_array[$j]['Req_local']} こんな風にしてみたら、エラーが発生してしまいました。

    • ベストアンサー
    • PHP
  • Smarty 三次元配列を使いたい

    最近Smartyを使い始めた者です。 以下のような多次元配列を、$smarty->assign('data', $data); します。 $data = array( [0] => array( [id] => 23 [comment] => 'aaa' [name] = array( [0] => 'xxx' [1] => 'yyy' )) [1] => array( [id] => 24 [comment] => 'bbb' [name] = array( [0] => 'zzz' )) [2] => array( [id] => 25 [comment] => 'ccc' [name] = array( [0] => 'ttt' [1] => 'uuu' )) ) そして、以下のようなテーブルを表示させたいのです。 |-------------------| | 23  | aaaa | xxxx | |    |     |------| |    |     | yyyy | |-------------------| | 24  | bbbb | zzzz | |-------------------| | 25  | cccc | tttt | |    |     |------| |    |     | uuuu | |-------------------| <td>タグのrowspan属性を使おうと思っています。 {foreach}をつかって、以下のようなものを書きましたが、駄目でした。 {foreach from=$data item=value01 name=kiji} <tr> <td rowspan="{$value01.numgoods}">{$value01.id}</td> <td rowspan="{$value01.numgoods}">{$value01.comment}</td> {foreach from=$value01 item=value02 name=goods} {if $smarty.foreach.goods.first} <td>{$value02.name.0]</td></tr> {else} <tr> <td>{$value.name.1}</td> </tr> {/if} {/foreach} {/foreach} エラー表示は、 syntax error: unrecognized tag: $value02.name.0 です 本当は、$value02.name の.0を三次元での要素数分だけ自動でループしてほしいのですが、その書き方がわかりません。 ネットをあさっても、これと言うサイトを見つけれません。 そもそも、三次元目の要素を取得するsmartyの方法がわかりません。 どなたかご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP 九九表

    PHPで九九の表を作っているのですが、 どうしてもここまでしか出来ませんでした。 <tr>,<td>を消してみると 数字が横に一列に表示されており、かけ算にはなっているのですが、 表にはどうしてもなりません。 なにかが違うのは分かっているのですが、ないが違うのか分かりません。 誰かお分かりになるかたがいましたらお伺いできませんでしょうか。 <?php echo '<table>'; echo '<tr>'; for ($i = 1; $i <= 9; $i++ ) { for ($j = 1; $j <= 9; $j++ ) echo '<td>' $i * $j'</td>'; echo '</tr>'; } echo '</table>'; ?>

    • ベストアンサー
    • PHP
  • php8の配列上限

    こんにちは 【環境】 Almalinux 9.3 PHP 8.2.15 apache 2.4.57 ウェブページでphpを使ってデータ入力画面を作っています。 250件程度のデータですが、データを登録して次のページに行くと125件分しかデータが送られていません。 特に変わったことはせず、php.iniもほぼデフォルトのままです。 上限を探ってみたのですが、実質メモリー量に依存で数値としては無いという情報を得ました。 結構シンプルに作っているので、原因がわかりません。 すみませんが、対応方法をご存じの方は教えてください。 ----簡易サンプル-------- <?php echo "<form method='POST' action='tourokku.htm'>\n"; echo " <input type="button" value="保存" onclick="location.href='touroku.htm'"><br />\n"; echo " <table border=1>\n"; echo " <tr><td>名前</td><td>電話番号</td><td>設問1</td><td>設問1</td><td>設問2</td><td>設問3</td><td>設問4</td><td>設問5</td><td>設問6</td><td>設問7</td></tr>\n"; for ($a=0;$a<250;$a++) { echo " <tr>\n"; echo " <td><input type='text' name='namae'></td>\n"; echo " <td><input type='text' name='tel'></td>\n"; for ($b=0;$b<7;$b++) { echo " <td><input type='number' min=0 name='s" . $b . "[" . $a . "]'></td>\n"; } echo " </tr>\n"; } echo "</form>\n"; ?> ----------- 抜粋版なのでこのまま実行するとおかしいかもしれませんが、雰囲気が伝わればと。。 上の値を入れて次のページに移動してphpinfoで値を確認すると、 $_POST['s0'] array( [0] => 1 [1] => 2 : : [124]=125 ) と、124番以降の値は前ページより引き継いでくれません。 メモリーの上限かと思い、php.iniの memory_limit = 128M -> 1024M post_max_size = 8M -> 200M 等、関係ある値を上げてみましたが効果はありませんでした。 できれば300件ぐらいまでは上げたいと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Smartyについて

    PHPとSmartyでカレンダーを製作しております。 カレンダーを以下の配列に格納し、テンプレートで表示しています。 $cal = Array([0] => Array([0] => [1] => [2] => [3] => 1 [4] => 2 [5] => 3 [6] => 4) [1] => Array([0] => 5 [1] => 6 [2] => 7 [3] => 8 [4] => 9 [5] => 10 [6] => 11) [2] => Array([0] => 12 [1] => 13 [2] => 14 [3] => 15 [4] => 16 [5] => 17 [6] => 18) [3] => Array([0] => 19 [1] => 20 [2] => 21 [3] => 22 [4] => 23 [5] => 24 [6] => 25) [4] => Array([0] => 26 [1] => 27 [2] => 28 [3] => 29 [4] => 30 [5] => 31 [6] => )) テンプレートは以下です。(一部のみ) {section name=index loop=$cal} <tr> <td> {$cal[index].0} </td> </tr> (以下省略) {section} これで、カレンダーは表示できていますが、これに付加して、 10日、15日、20日、30日の<td>のバックカラーを変えたいのです。 そこで、以下の配列をテンプレートに渡し、実現したいのですが 上記のテンプレートにどう組み込めばいいのかをご教授下さい。 $day = Array([0] => Array([0] => 10 ) [1] => Array([0] => 15 ) [2] => Array([0] => 20 ) [3] => Array([0] => 30 ))

    • ベストアンサー
    • PHP
  • カレンダーについて教えてください。

    phpでカレンダーを作っているのですが休日を設定したい場合 の方法がわかりません。 for文で日にちを表示させているのですが休日設定の配列の値を どのように参照すればいいかで悩んでおります。 // 現在の日付を取得 $year = date("Y"); $month = date("n"); $today = date("j"); // 休日を設定 $holyday = array('1', '5', '12', '28'); // カレンダー始まり echo "<table width='200' height='182' border='0'><tr><td valign='top'>"; echo "<table border ='0' bgcolor='#cccccc' cellspacing='1' cellpadding='3' width='170'><tr>\n"; echo "<td colspan='7' bgcolor='white' align='center' style='font-size:12px;font-weight:bold;color:#6666ff'>"; echo $year . "年" . $month . "月</td><tr>"; // 曜日表示部分 $weekday = array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); for ($i = 0 ; $i < 7 ; $i++) { if ($i == 0 or $i == 6) { echo "<td class='head_" . $i . "'>"; } else { echo "<td class='head'>"; } echo $weekday[$i] . "</td>\n"; } echo "</tr>\n"; // 日数と曜日の計算 $days = cal_days_in_month (CAL_GREGORIAN, $month, $year); $week_start = jddayofweek (cal_to_jd(CAL_GREGORIAN, $month,1, $year) , 0); // 日付が始まる前の空白 for ($dot1 = 0 ; $dot1 < $week_start ; $dot1++) { echo "<td align='center' class='dot'></td>\n"; } // 日付表示部分 for ($day = 1 ; $day <= $days ; $day++) { if (($day+$week_start)%7 == 1) { // 日曜日 echo "<tr>\n<td class='sun'>$day</td>\n"; } else if (($day+$week_start)%7 == 0) { // 土曜日 echo "<td class='sat'>$day</td>\n</tr>\n"; } else if ($day == $today) { // 今日 echo "<td class = 'today'>$day</td>\n"; // ここで休日を表示させるのですが方法がわかりません。 } else if ($day == $holyday[0]) { // 休日 echo "<td class = 'holyday'>$day</td>\n"; } else { // 平日 echo "<td class='othr'>$day</td>\n"; } } // 最終日後の空欄の表示 $wend = 35 - ($days + $week_start); if ($wend < 0) { $wend += 7; } if ($wend == 7) { echo ''; } else if ($wend != 0) { for ($dot2 =0 ; $dot2 < $wend ;$dot2++) { echo "<td align='center' class='dot'></td>\n"; } } // カレンダー終り echo "</tr></table>\n"; echo "</td></tr></table>\n";

    • ベストアンサー
    • PHP
  • 九九の表において5の倍数のみ青文字にする。

    PHPで九九の表において5の倍数のみ青文字にする方法教えてください。 <?php echo "<tr bgcolor='#99FF99'>"; echo "<td></td>"; for( $i=1; $i <= 9; $i++ ){ echo "<font size=6>$i</font></td>"; } echo "$i</tr>\n"; for( $i=1; $i <= 9; $i++ ){ echo "<tr><td bgcolor='#99FF99'>" . $i . "</td>"; for( $j=1; $j<=9; $j++ ){ $atai = $i * $j; echo "<td>" . $atai . "</td>"; } echo "</tr>\n"; } ?>

    • ベストアンサー
    • PHP
  • 九九の表において5の数字にする方法教えてください。

    九九の表において5の数字にする方法教えてください。 <?php echo "<tr bgcolor='#99FF99'>"; echo "<td></td>"; for( $i=1; $i <= 9; $i++ ){ echo "<font size=6>$i</font></td>"; } echo "$i</tr>\n"; for( $i=1; $i <= 9; $i++ ){ echo "<tr><td bgcolor='#99FF99'>" . $i . "</td>"; for( $j=1; $j<=9; $j++ ){ $atai = $i * $j; echo "<td>" . $atai . "</td>"; } echo "</tr>\n"; } ?>

    • 締切済み
    • PHP

専門家に質問してみよう