人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【急ぎ困り】MYsql phpで困りました。
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;
?>




1389706479
●拡大する

●質問者: ak
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● 牛乳先生(tukihatu)
●70ポイント ベストアンサー

もう解決したかもしれませんが、やる場合は力技になると思います。(綺麗なやり方誰か教えてください本当に)
一度全て配列に読み込んでから再度ループさせ、後ろのキーとの判別式を作ります。

<?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すると良いです。(結構難しいです)


akさんのコメント
大変詳しくありがとうございます!こういった感じでまだまだ記述できないので日々勉強ですね((+_+))非常に助かりました。

2 ● TransFreeBSD
●30ポイント

こんなのを見つけたので参考に書いてみました。
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


akさんのコメント
こういった下記書き方もあるんですね!大変ありがとうございます!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ