配列を利用したテーブルの分割方法

このQ&Aのポイント
  • PHP・MySQLを独学で利用し、配列を利用して表示されるテーブルを分ける方法について質問します。
  • 特定条件でデータの表示を分ける方法を知りたいです。また、得意先ごとにテーブルを分けて表示することは可能なのかも教えてほしいです。
  • 最終的にはPXDocというソフトを利用して各テーブルのデータを得意先ごとにページ分けして印刷させたいです。
回答を見る
  • ベストアンサー

配列を利用して表示されるテーブルを分けたいです

PHP・MySQLを独学で利用しています。 以下のtable1のようなテーブルから各値を取り出して表示させたいのですが、特定条件でテーブル表示を分けることができないものか悩んでいます。 table1 ID・得意先コード・受注内容・受注金額・日付 1・   28  ・ xxxx ・ 10000 ・20080701 2・   32  ・ aaaa ・  5000 ・20080704 3・   28  ・ YYYY ・ 20000 ・20080706 4・   15  ・ tttt ・ 15000 ・20080709 5・   32  ・ kkkk ・  3000 ・20080801 (得意先コードはtable2のIDです) table2 ID・得意先名 15・ BBB 28・ CCC 32・ DDD フォームで指定した年月(2008年07月など)を条件に、table2とLEFTJOINした結果を取り出すまではfor文を利用して行うことができました。 得意先コード・受注内容・受注金額・ 日付 ・得意先   15  ・ tttt ・ 15000 ・20080709・BBB   28  ・ xxxx ・ 10000 ・20080701・CCC   28  ・ YYYY ・ 20000 ・20080706・CCC   32  ・ aaaa ・  5000 ・20080704・DDD これを以下のように得意先コードごとにテーブルを分けて表示することは可能なのでしょうか。 得意先コード・受注内容・受注金額・日付   15  ・ tttt ・ 15000 ・20080709 得意先コード・受注内容・受注金額・日付   28  ・ xxxx ・ 10000 ・20080701   28  ・ YYYY ・ 20000 ・20080706 得意先コード・受注内容・受注金額・日付   32  ・ aaaa ・  5000 ・20080704 最終的にはPXDocというソフトを利用して各テーブルのデータを得意先ごとにページ分けして印刷させたいのです。 まずは特定条件でデータを分けることができるかどうかがわからず、質問させていただきました。 お知恵をお借りできるとありがたいです。よろしくお願いします。

  • PHP
  • 回答数3
  • ありがとう数3

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

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

print "<pre>"; print_r($data); print "</pre>"; で構造がわかると思いますが以下のようにするとよいのでは? (実際にデータが手元にあるわけではないので想像しながらですが・・・) foreach($data as $kobetsu_data){ print "<table border='1'>"; print "<tr><td>得意先ID</td><td>内容</td><td>金額</td><td>日付</td></tr>"; foreach($kobetsu_data as $val){ print "<tr><td>".$val['client_id']."</td>"; print "<td>".$val['title']."</td>"; print "<td>".$val['kingaku']."</td>"; print "<td>".$val['date']."</td></tr>"; } print "</table>"; }

jcnuser
質問者

お礼

yambejpさん、大変わかりやすく書いていただきありがとうございました。 print_r($data);で構造を確認するのは以前にやったことがあるのを思い出し、すぐに理解できました。 foreachにforeachの入れ子をすることは考えもつきませんでした。 思ったとおりの結果が得られました。 本当にありがとうございます。 教えていただいたものを参考に、これからもう少しforeachのことについては勉強してみたいと思います。

その他の回答 (2)

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

$data[$row['得意先コード']][] = $row; としてみてください

jcnuser
質問者

お礼

yambejpさん、教えていただいたとおり修正してみました。 以下が修正した構文です。 知識不足で申し訳ないのですが、教えていただいたキーを活用する方法がわかりませんでした。 実行するとテーブル枠と項目名のみが表示され、各値は表示されませんでした。 $seikyu = $_POST['y']*100+$_POST['m']; //フォームより受け取った請求月 $sql = "SELECT DISTINCT table1.*,table2.client FROM table1 LEFT JOIN table2 ON table1.client_id = table2.id WHERE date like '%$seikyu%' ORDER BY client_id ASC,date ASC"; $res = $conn->query($sql); $count = $res->numRows(); while($row=$res->fetchRow(DB_FETCHMODE_ASSOC)) { $data[$row['client_id']][] = $row; //SQLで取得した配列 } print "<table border='1'>"; print "<tr><td>得意先ID</td><td>内容</td><td>金額</td><td>日付</td></tr>"; for($i=0; $i<$count; $i++) { print "<tr><td>".$data[$i][client_id]."</td>"; print "<td>".$data[$i][title]."</td>"; print "<td>".$data[$i][kingaku]."</td>"; print "<td>".$data[$i][date]."</td></tr>"; } print "</table>";

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

得意先コードをキーにした配列をつくって 配列をもとにテーブルを出力すればよいでしょう

jcnuser
質問者

お礼

yambejpさん、さっそくのお返事ありがとうございます。 >得意先コードをキーにした配列をつくって というのは foreach($得意先コード as $key => $value) { }; という感じで利用すればということでしょうか? 上記のような構文を試してみましたが、foreach文がよく理解できていないせいか、思ったような結果が得られませんでした。 今のところ成功しているのは質問に記載したとおりのfor文のみで、一覧表示に成功したのは以下のような構文です。 //フォームより受け取った請求月 $seikyu = $_POST['y']*100+$_POST['m']; $sql = "SELECT DISTINCT table1.*,table2.client FROM table1 LEFT JOIN table2 ON table1.client_id = table2.id WHERE date like '%$seikyu%' ORDER BY client_id ASC,date ASC"; $res = $conn->query($sql); $count = $res->numRows(); while($row=$res->fetchRow(DB_FETCHMODE_ASSOC)) { $data[] = $row; //SQLで取得した配列 } print "<table border='1'>"; print "<tr><td>得意先ID</td><td>内容</td><td>金額</td><td>日付</td></tr>"; for($i=0; $i<$count; $i++) { print "<tr><td>".$data[$i][client_id]."</td>"; print "<td>".$data[$i][title]."</td>"; print "<td>".$data[$i][kingaku]."</td>"; print "<td>".$data[$i][date]."</td></tr>"; } print "</table>"; もしよろしければ得意先コードをキーにする方法を教えていただけませんでしょうか。よろしくお願いいたします。

関連するQ&A

  • テーブルの集計値を別テーブルに更新したいのですが

    mysql+PHPを利用していますが、表記の件で数日間悩んでおります。 実際に可能な操作かどうかもわかりません。 よいお知恵があったら教えてください。 下のようなテーブルがそれぞれあります。 table1 ID・得意先コード・受注内容・受注金額 1・   28  ・ xxxx ・ 10000 2・   32  ・ aaaa ・  5000 3・   28  ・ YYYY ・ 20000 4・   15  ・ tttt ・ 15000 5・   32  ・ kkkk ・  3000 (得意先コードはtable2のIDです) table2 ID・得意先名・受注金額合計 15・ BBB・ 28・ CCC・ 32・ DDD・ PHPファイルを実行する度に、 「table1」の「受注金額」を「得意先コード」ごとに集計した各値を、「table2」の各「受注金額合計」にそれぞれ更新していきたいと思っています。 色々調べたところ以下の構文が紹介されていたので試してみました。 Update table2 set 受注金額合計 = (select sum(受注金額) from table1 INNER JOIN table2 ON table1.得意先コード = table2.ID) すると「#1064 - You have an error in your SQL syntax」というエラーが出てしまいました。select以降の構文が良くないらしいのですが、私の書き方が悪いのか、それすらもわからない状態です。 MySQLは4.0.24、PHPは4。レンタルサーバーを利用しています。 なにとぞよろしくお願いします。

  • PHP 多次元配列のソート

    $array = array( array("address" =>"eeee@dddd.ddd","name" => "あいう"), array("name" => "はざま","address" => "cccc@dddd.ddd"), array("name" => "かきく","address" => "tttt@ccc.eee"), array("name" => "さく","address" => "bbbb@dddd.ddd"), array("name" => "あか","address" => "aaaa@dddd.ddd") ); 上記のような多次元配列があった場合 sort($array); とすると 以下のようなデフォルトの配置が Array ( [0] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [1] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [4] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) ) 上記の並びが Array ( [0] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [1] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [4] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) ) nameキーの値をもとにあいうえお順にならびかえられます。 がこれをnameキーではなく addressキーで並び替えたいと思ったとき、 usort($array , function($a,$b){ if($a["address"]< $b["address"]){ return -1; }else{ return 1; } } ); と上記のようのおこなうと Array ( [0] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [1] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [2] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [3] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) [4] => Array ( [name] => かきく [address] => tttt@ccc.eee ) ) とうまくaddressキーでabcdの順にソートできています。 次に usort($array , function($a,$b){ return strcmp($a["address"],$b["address"])? -1:1; } ); と上記のようにstrcmp関数を使うと Array ( [0] => Array ( [name] => あか [address] => aaaa@dddd.ddd ) [1] => Array ( [name] => さく [address] => bbbb@dddd.ddd ) [2] => Array ( [name] => かきく [address] => tttt@ccc.eee ) [3] => Array ( [name] => はざま [address] => cccc@dddd.ddd ) [4] => Array ( [address] => eeee@dddd.ddd [name] => あいう ) ) うまくソートできませんでした。 この、直接 $a, $bの大小を条件とした場合と strcmp — バイナリセーフな文字列比較をおこなうstrcmp とは、どのような処理の違いがあるのでしょうか?

    • ベストアンサー
    • PHP
  • 集計結果を別テーブルに更新クエリで書き出したい。

    Access2000を使っています。 テーブルとフィールドの関係は次のようになっています。 (一部、Northwind.mdbを使っています。) 受注 ---------------------- 得意先コード 受注コード 受注明細 ---------------------- 受注コード 単価 数量 売上集計 ---------------------- 得意先コード 合計 受注明細テーブルの単価と数量を掛け合わせたものの合計を 売上集計テーブルの合計に書き出したいと思います。 次の選択クエリの合計の値を売上集計テーブルの取引先コード の一致する場所に書き出したいのです。 SELECT 受注.得意先コード, Sum([単価]*[数量]) AS 合計 FROM 受注 INNER JOIN 受注明細 ON 受注.受注コード = 受注明細.受注コード GROUP BY 受注.得意先コード; 売上集計テーブルと受注テーブルの得意先コードは同じものが 存在します。 よろしくお願いします。

  • テーブル列の表示・非表示機能の追加

    <table border="0" id="tbl1"> <tr> <th>A1</td> <th>B1</td> <th colspan="2">C1</td> </tr> <tr> <td>aaa</td> <td>bbb</td> <td>ccc</td> <td>ddd</td> </tr> <tr> <td>aaa</td> <td>bbb</td> <td>ccc</td> <td>ddd</td> </tr> </table> というテーブルで、C1列(要はデータcccとdddの2列)を表示/非表示を行いたいです。 調べてみたところ、colspanが設定されている例がありませんでした。 お判りになる方、よろしくお願いします。

  • 【Excel】条件を満たすデータをまとめる

    Excel2003を使用しています。 《表1》 日付       コード  社名   受注番号  金額 2012/04/30   100   AAA   123-45   10000 2012/05/31   100   AAA   123-45   15000 2012/06/30   100   AAA   120-56   10000 2012/05/31   101   BBB   121-44   20000 2012/06/30   101   BBB   123-45   20000 2012/04/30   102   CCC   124-40   30000 2012/06/30   102   CCC   124-40   10000 2012/07/31   102   CCC   124-40   10000 《表1》で、コードと受注番号の両方が同じ場合、その金額を合計して1行にまとめ、《表2》のようにしたいです。 日付は新しいほうを残したいのですが、可能でしょうか? 《表2》 日付        コード  社名   受注番号  金額 2012/05/31    100   AAA   123-45   25000 2012/06/30    100   AAA   120-56   10000 2012/05/31    101   BBB   121-44   20000 2012/06/30    101   BBB   123-45   20000 2012/07/31    102   CCC   124-40   50000 《表2》の状態からさらに他のデータと比較して転記したく、最初はピボットテーブルを使用してみたのですが、使い慣れていないせいか、うまくいかず…。 できれば、VBAか関数で《表2》のようにしたいです。 よろしくお願いします。

  • テーブルの正しい雛形を教えてください。

    <table> <tr><td>aaa</td><td>bbb</td></tr> <tr><td>ccc</td><td>ddd</td></tr> </table> これってダメな例なんですよね? いつもこれでテーブルを作っています。

    • ベストアンサー
    • HTML
  • テーブル更新について

    入力テーブル NO A項目 B項目 C項目 D項目 1  SSSS AAAA CCCC EEEEE 2 QQQQ SSSS WWWW FFFF 3 TTTT JJJJ VVVV UUUU 4 ZZZZ YYYY IIII PPPP (新規データ) 検索テーブル NO A項目 C項目 D項目 1  PPPP UUUU LLLL 2 RRRR MMMM VVVV 3 YYYY FFFF AAAA 4 OOOO DDDD WWWW 5 上記のように入力テーブルの新規データを検索テーブルへ追加したいと考えています。 入力テーブルの最終行に新規データが追加されるとして、それを検索テーブルへ追加する場合、 方法として、(1)Access VBAを使う場合と、(2)SQL文を使用する場合とあると思います。 どちらでもいいので、どうすればいいのか、教えていただけないのでしょうか。 よろしくお願いします。

  • excel ピボットテーブルについて

    お世話になります。 Excelのピボットテーブルについてですが、例えば下記のような感じのデータを 集計したいときに、行ラベルに「名前」を持って行き、列ラベルには「日付」を持って いったとしたときに、行ラベルはAAA、BBB、CCC、DDDではなく、AAAとBBB以外は その他でまとめたいとき(AAA、BBB、その他)、どう設定すればいいか悩んでいます。 ご存知の方がいらっしゃれば教えてください。ちなみにExcel2010を使用しています。 日付 名前 個数 4/1  AAA 1 4/1  BBB 1 4/2  CCC 1 4/2  DDD 2 4/2  AAA  3 4/3  CCC 1

  • SQLについて

    お世話になります。 まず実現したいことを書きます。 DBテーブル内容 受注テーブル 受注番号 案件番号 得意先コード 1      1      0001 2      1      0001 3      1      0001 4      2      0002 5      2      0002 6      3      0003 7      4      0001 8      5      0003 のようにデータが入っている時に 受注番号 案件番号 得意先コード 1      1     0001 2      1     null 3      1     null 4      2     0002 5      2     null 6      3     0003 7      4     0001 8      5     0003 このように取得したいのですが、 (案件番号と得意先コードが一致している時は一番上に だけ得意先コードを表示それ以外はnullをセットする) いろいろ考えたのですが、まったくわかりませんでした。 どなたかアドバイスをお願いします。 よろしくお願いします。

  • AccessSQL 1つのテーブルに複数のデータ

    お世話になっております。 アクセスSQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 つまり、AAAを取得した結果、SQL一つで、上記テーブルデータをF_1:AAA以外、取得したい要件です。 有識者の方、ご享受頂きたいです。 宜しくお願い致します 【自力で考えた結果】 -------------------------- select F_MenuCD,F_ZaiCD from [TABLE] where F_MenuCD IN ( SELECT F_ZaiCD FROM [TABLE] WHERE F_MenuCD IN ('AAA') ); F_1 F_2 BBB XXX CCC DDD を取得するSQLは上記でいけそうなのですが、 DDD YYY を、1つのSQLで取得したいのです。

専門家に質問してみよう