重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

以下の通り、歴年運動会の徒競走順位が記録されたテーブル(mytable)があります。

ID 氏名 順位 運動会開催年
1 阿藤 1 2009
2 伊藤 2 2009
3 宇藤 3 2009
4 江藤 4 2009
5 尾藤 5 2009
6 加藤 1 2010
7 木藤 2 2010
8 工藤 3 2010
9 毛藤 4 2010

ここで、次のように書けば・・・

$sql = "select * from mytable order by ID";
$con = mysql_connect(DBSERVER, DBUSER, DBPASSWORD);
$rst = mysql_query($sql, $con);
$recmax = mysql_num_rows($rst);
if ($recmax > 0) {
$body = "<ol>\n";
for ($recnum = 0; $recnum < $recmax; $recnum++) {
$col = mysql_fetch_array($rst);
$body .= "<li>$col["氏名"]\n";
}
$body .= "</ol>\n";
}

こういう箇条書きリストが得られます。
<ol>
<li>阿藤
<li>伊藤
<li>宇藤
<li>江藤
<li>尾藤
<li>加藤
<li>木藤
<li>工藤
<li>毛藤
</ol>

ここで、以下のような箇条書きスタイルにするには、どう書いたらいいでしょうか?
ifの分岐内に一工夫しなければならないことは推察できますが、
2回ループをさせる??すみません、よくロジックが整理できません。

<div>2009年運動会</div>
<ol>
<li>阿藤
<li>伊藤
<li>宇藤
<li>江藤
<li>尾藤
</ol>
<div>2010年運動会</div>
<ol>
<li>加藤
<li>木藤
<li>工藤
<li>毛藤
</ol>

A 回答 (2件)

実際に試してませんがフロー的にはこんな感じでいけるのでは?



$sql = "select ID,氏名,運動会開催年 from mytable order by ID,運動会開催年";
$res = mysql_query($sql, $con);
$pre_nendo="";
$list ="";

while($row = mysql_fetch_array($res,MYSQL_ASSOC)){
$nendo=$row["運動会開催年"];
if($pre_nendo!==$nendo){
if($list!=="") $list.="</ol>\n";
$list.="<div>{$nendo}年運動会</div>\n";
$list.= "<ol>\n";
}
$list .= "<li>{$row["氏名"]}</li>\n";
$pre_nendo=$nendo;
}
if($list!=="") $list .= "</ol>\n";

$body.=$list;
    • good
    • 0
この回答へのお礼

yamabejpさん、完璧なコードをご提示くださりありがとうございました。

早速本番環境に組み込みまして、120%期待通りに動作しました。

最初にforで覚えたので、whileの使い方にあまりなれていないのですが、
こうやってやるんですね・・

正直、いくら時間をかけて考えても、わたしでは解がでなかったと思われます。

このたびは(このたび'も')、本当に助かりました。ありがとうございました。

お礼日時:2011/08/29 15:56

まず年度でORDER BYが必要ですね



で、年度がかわったら別のOLを書くようにすればよいでしょう

この回答への補足

yamabejpさん、いつもお世話になります。
ご回答ありがとうございます。

>で、年度がかわったら別のOLを書くようにすればよいでしょう

ええっと、おっしゃるとおりなのでしょうが、
元質問のプログラムですと、OLがfor構文の外に出ていますよね?
そうすると、年度が変わったという判定と</OL><OL>の記述というロジックを
どう組み込んだらよいかさっぱり検討つかないのが元質問の主旨です。

ものすごい複雑な(冗長な?(^_^;)プログラムになってしまいそうな
気がするのですが・・・

補足日時:2011/08/29 01:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!