- ベストアンサー
総当り表を作成するためのPHPコードのサンプルとは?
- 特定のデータを使用して総当り表を作成するためには、PHPを使用することが必要です。
- 以下のSQL文を使用して、必要なデータを取得することができます。
- 取得したデータを使って、総当り表を作成するためのPHPコードのサンプルを以下に示します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
チーム名がA,B,C,D,...,Lだと仮定すると、 $teams = range('A', 'L'); $table = array_fill_keys($teams, array_fill_keys($teams, '-')); $sql = 'SELECT ...'; $result = mysql_query($sql, $link); while ($game = mysql_fetch_assoc($result)) { if ($game['homepoint'] > $game['awaypoint']) { $table[$game['hometeam']][$game['awayteam']] = $game['homepoint'] . '○' . $game['awaypoint']; $table[$game['awayteam']][$game['hometeam']] = $game['awaypoint'] . '●' . $game['homepoint']; } elseif ($game['homepoint'] < $game['awaypoint']) { $table[$game['hometeam']][$game['awayteam']] = $game['homepoint'] . '●' . $game['awaypoint']; $table[$game['awayteam']][$game['hometeam']] = $game['awaypoint'] . '○' . $game['homepoint']; } else { $table[$game['hometeam']][$game['awayteam']] = $game['homepoint'] . '△' . $game['awaypoint']; $table[$game['awayteam']][$game['hometeam']] = $game['awaypoint'] . '△' . $game['homepoint']; } } が正しいです。(全角スペースでインデントしてるので注意) チームIDを取ってくるなら $teams = range(1, 12); チーム名を取ってくるなら $teams = range('A', 'L'); としないといけないのは自明ですよね。 実際にはこんな連番じゃなくてちゃんとした名前になってると思いますが。
その他の回答 (5)
デバッグはE_NOTICE非表示でされているんでしょうか? であるとすればバグを発見するのが非常に難しくなるので今後は表示するようにしましょう。 http://qiita.com/mpyw/items/2f9955db1c02eeef43ea 未定義の変数がNULLに自動的に初期化されて、さらに配列のキーにセットするときに自動的に空文字に変換されて、 $table[""][""] に最後に取得した結果だけ入っているんだと思います。 サンプルデータのように取得するには SELECT t.team_name AS hometeam, ti.homepoint, ti.awaypoint, t1.team_name AS awayteam FROM team AS t1 INNER JOIN (team t INNER JOIN taisen ti ON t.team_id = ti.hometeam) ON t1.team_id = ti.awayteam WHERE t.`year` = '2012' AND t.`leagueid` = 1 が正しいですね。
補足
デバックの件了解いたしました。 有難うございます。 上記のSELECT文にてA~Dのデータはとれたのですが、 今度は http://codepad.org/GpkPg1Rz のように表示されてしまいます。 なんどもご質問、お手数をお掛けいたしますが、完成までお付き合いいただければと思っていますので、 宜しくお願いいたします。
うーん、ちゃんとデータがSELECT出来ていないような気がします・・・ while($game = mysql_fetch_assoc($result)) { の直後に var_dump($game); を入れてみてください。 期待する個数より少ない個数しか取得できていなかったり、カラム名が期待しているものと違ったりする場合があるかもしれないので、私が提示したサンプルデータ内で使用されている$gamesの各要素のような形で取得できているか再確認してください。 なお、チーム名を表に入れたい場合はarray_fill_keysの第1引数にチーム名の配列を代わりに入れていただければ実現できます。その場合は取得するデータの「hometeam」と「awayteam」がそれぞれチーム名となるようにしてください。
補足
dumpしたところ http://codepad.org/kU0Pgrqc のように返ってきており、ご教授いただいた$gamesとは違った内容になっています。 SELECT文がおかしいということはありますでしょうか? チーム名の件に関しましては了解いたしました。 データがちゃんと取れた場合実装してみます。
while($rows = mysql_fetch_assoc($sql)) { foreach ($rows as $game) { ... } } ではなくて $sql = 'SELECT ...'; $result = mysql_query($sql, $link); while($game = mysql_fetch_assoc($result)) { ... } ですね。 繰り返しますがmysql関数は非推奨なのでPDOへの書き換えをおすすめします。 PDOであれば foreach ($pdo->query('SELECT ...') as $game) { ... } のようにかなりスマートに書けます。 ちなみにこの際使用されるのはPDO::ATTR_DEFAULT_FETCH_MODEで指定したフェッチモードで、 デフォルトはPDO::FETCH_BOTHとなっています。 PDO::FETCH_ASSOCかPDO::FETCH_OBJに変更することを推奨します。 詳しくはこちらで。 http://qiita.com/mpyw/items/b00b72c5c95aac573b71
補足
こんがらがってしまったため、再度整理させていただきたいと思っています。 PDOは今回は申し訳ないのですがなしでお願いいたします。(今後勉強させていただきます。) $sql = 'SELECT ...'; $result = mysql_query($sql, $link); while($game = mysql_fetch_assoc($result)) { if ($game['homepoint'] > $game['awaypoint']) { $table[$game['hometeam']][$game['awayteam']] = $game['homepoint'] . '○' . $game['awaypoint']; $table[$game['awayteam']][$game['hometeam']] = $game['awaypoint'] . '●' . $game['homepoint']; } elseif ($game['homepoint'] < $game['awaypoint']) { $table[$game['hometeam']][$game['awayteam']] = $game['homepoint'] . '●' . $game['awaypoint']; $table[$game['awayteam']][$game['hometeam']] = $game['awaypoint'] . '○' . $game['homepoint']; } else { $table[$game['hometeam']][$game['awayteam']] = $game['homepoint'] . '△' . $game['awaypoint']; $table[$game['awayteam']][$game['hometeam']] = $game['awaypoint'] . '△' . $game['homepoint']; } } にてデータを取得した後に foreach($teams as $team) { $name .= '<th class="top">' .$team. '</th>'."\n"; } と foreach($table as $team => $line) { $list .= '<tr>'."\n"; $list .= '<th>' .$team. '</th>'."\n"; foreach ($line as $cell) { $list .= '<td>' .$cell. '</td>'."\n"; } $list .= '</tr>'."\n"; } としており、 html側にて吐き出したところ <table> <thead> <tr> <th class="first"></th> <?php echo $teamName; ?> </tr> </thead> <tbody> <?php echo $leagueList; ?> </tbody> </table> 1 2 3 4 5 6 7 8 9 10 11 12 1 - - - - - - - - - - - - 2 - - - - - - - - - - - - 3 - - - - - - - - - - - - 4 - - - - - - - - - - - - 5 - - - - - - - - - - - - 6 - - - - - - - - - - - - 7 - - - - - - - - - - - - 8 - - - - - - - - - - - - 9 - - - - - - - - - - - - 10 - - - - - - - - - - - - 11 - - - - - - - - - - - - 12 - - - - - - - - - - - - 2●5 と表示されてしまいます。 原因がわかりますでしょうか。 また、現在縦、横に1~12の番号が振られてるかと思いますが、こちらをチーム名にすることも可能でしょうか?
こんな感じ? http://codepad.org/vln3p4Dr http://codepad.viper-7.com/Lx33Ts CSSでカッコ良くしてみました。
補足
有難う御座います。 実装させていただいてるのでが、うまくいかず困っています。 http://codepad.org/Myfu9zBA としており、それをforeachでまわしているのですが、結果が 1 2 3 4 5 6 7 8 9 10 11 12 1 1△1 - - - - - - - - - - - 2 - 2△2 - - - - - - - - - - 3 - - 3△3 - - - - - - - - - 4 - - - 4△4 - - - - - - - - 5 - - - - 5△5 - - - - - - - 6 - - - - - - - - - - - - 7 - - - - - - - - - - - - 8 - - - - - - - - - - - - 9 - - - - - - - - - - - - 10 - - - - - - - - - - - - 11 - - - - - - - - - - - - 12 - - - - - - - - - - - - A A△A B B△B C C△C 0 0△0 D D△D といった内容になってしまいます。
データベースの扱いに関して http://qiita.com/mpyw/items/b00b72c5c95aac573b71 総当たり表の作り方 http://codepad.org/zWREtyF3
補足
ご解答有難う御座います。 また、サンプルのご提供も誠に有難う御座います。 総当たり表の作り方まではできたのですが、ここから表に作っていくにはどうしたらよろしいでしょうか。 度重なるご質問で申し訳ありませんが、宜しくお願いいたします。
お礼
実装することができました。 最後までお付き合いいただき、誠に有難う御座います。