tableをwhile文で作成した時に、各行の<td><?php echo h($post['a']); ?>
</td>がかぶった時に結合したいと考えています。rowspanを使う?
どのように記述すればよいかわからなかったためアドバイスをいただけると幸いです。
*尚画像のような結果を得たいです。
例
<?php
$sql = 'SELECT * FROM mmm ,sss WHERE mmm.name=sss.a';
$posts = mysql_query($sql) or die(mysql_error());
?>
<table>
<thead>
<tr>
<th>名前</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<?php
while($post = mysql_fetch_assoc($posts)):
?>
<tr>
<td><?php echo h($post['a']); ?>
</td>
<td><?php echo h($post['b']); ?>
</td>
</tr>
<?php
endwhile;
?>
もう解決したかもしれませんが、やる場合は力技になると思います。(綺麗なやり方誰か教えてください本当に)
一度全て配列に読み込んでから再度ループさせ、後ろのキーとの判別式を作ります。
<?php $postArray = array(); while($post = mysql_fetch_assoc($posts)): $postArray[] = $post; endwhile; $tdFlag = 1; foreach($postArray as $key => $val){ $key = intval($key); ?> <tr> <?php if($tdFlag == 1 && $val['a'] === $postArray[$key+1]['a']){ while($val['a'] === $postArray[$key+1]['a']){//隣り合った同じキーの数を判別 $tdFlag++; $key++; } ?> <td rowspan="<?php echo h($tdFlag); ?>"><?php echo h($val['a']); ?> </td> <?php }else if($tdFlag != 1){ $tdFlag--; }else{ ?> <td><?php echo h($val['a']); ?> </td> <?php } ?> <td><?php echo h($val['b']); ?> </td> </tr> <?php } ?>
汚いですがこんな感じ。<?範囲が細かいのでtdタグも全部echoで表示したほうが見栄えいいかもしれませんが。
※("a",1),("b",2),("a",3)という並びのときの話、この式だとrowspanはしません。
ちなみにテーブル名が同じでもsqlテーブルが離れている場合に整理したいなら、配列に読み込んだ後sortすると良いです。(結構難しいです)
もう解決したかもしれませんが、やる場合は力技になると思います。(綺麗なやり方誰か教えてください本当に)
一度全て配列に読み込んでから再度ループさせ、後ろのキーとの判別式を作ります。
<?php $postArray = array(); while($post = mysql_fetch_assoc($posts)): $postArray[] = $post; endwhile; $tdFlag = 1; foreach($postArray as $key => $val){ $key = intval($key); ?> <tr> <?php if($tdFlag == 1 && $val['a'] === $postArray[$key+1]['a']){ while($val['a'] === $postArray[$key+1]['a']){//隣り合った同じキーの数を判別 $tdFlag++; $key++; } ?> <td rowspan="<?php echo h($tdFlag); ?>"><?php echo h($val['a']); ?> </td> <?php }else if($tdFlag != 1){ $tdFlag--; }else{ ?> <td><?php echo h($val['a']); ?> </td> <?php } ?> <td><?php echo h($val['b']); ?> </td> </tr> <?php } ?>
汚いですがこんな感じ。<?範囲が細かいのでtdタグも全部echoで表示したほうが見栄えいいかもしれませんが。
※("a",1),("b",2),("a",3)という並びのときの話、この式だとrowspanはしません。
ちなみにテーブル名が同じでもsqlテーブルが離れている場合に整理したいなら、配列に読み込んだ後sortすると良いです。(結構難しいです)
こんなのを見つけたので参考に書いてみました。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1475575039
データベースからの取得が逆順という前提です。SQLで並びを逆にしておいてください。
whileのループの最初で取得したのは比較用で次のループで使います。
得られた配列に'rowspan'というのを加えています。
後半それを元に、0だったらaカラムの表示はなし、1だったら通常のtd、それ以外はrowspan付き、とします。
<?php // $testdata = array(); // for ($i=0; $i<10; $i++) { // $testdata[] = array('a' => intval($i/3), 'b' => $i); // } $postArray = array(); $rowspan = 1; $post = mysql_fetch_assoc($posts); // $post = array_pop($testdata); while ($post): $pre = mysql_fetch_assoc($posts); // $pre = array_pop($testdata); if (isset($pre) && $pre['a'] == $post['a']) { $post['rowspan'] = 0; $rowspan++; } else { $post['rowspan'] = $rowspan; $rowspan = 1; } $postArray[] = $post; $post = $pre; endwhile; ?> <table> <thead> <tr> <th>名前</th> <th>内容</th> </tr> </thead> <tbody> <?php foreach (array_reverse($postArray) as $post) { ?> <tr> <?php if ($post['rowspan'] !== 0){ ?> <?php if ($post['rowspan'] === 1){ ?> <td> <?php } else { ?> <td rowspan="<?php echo $post['rowspan']; ?>"> <?php } ?> <?php echo h($post['a']); ?></td> <?php } ?> <td><?php echo h($post['b']); ?> </td> </tr> <?php } ?> </tbody> </table>
ideoneでのテストコード
http://ideone.com/ZKWB4g
こういった下記書き方もあるんですね!大変ありがとうございます!
大変詳しくありがとうございます!こういった感じでまだまだ記述できないので日々勉強ですね*1非常に助かりました。
*1:+_+