1389706479 【急ぎ困り】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;
?>


回答の条件
  • 1人30回まで
  • 登録:
  • 終了:2014/01/16 11:16:57
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tukihatu No.1

回答回数180ベストアンサー獲得回数32

ポイント70pt

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

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

id:akakak

大変詳しくありがとうございます!こういった感じでまだまだ記述できないので日々勉強ですね*1非常に助かりました。

*1:+_+

2014/01/16 11:16:37

その他の回答1件)

id:tukihatu No.1

回答回数180ベストアンサー獲得回数32ここでベストアンサー

ポイント70pt

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

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

id:akakak

大変詳しくありがとうございます!こういった感じでまだまだ記述できないので日々勉強ですね*1非常に助かりました。

*1:+_+

2014/01/16 11:16:37
id:TransFreeBSD No.2

回答回数668ベストアンサー獲得回数268

ポイント30pt

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

id:akakak

こういった下記書き方もあるんですね!大変ありがとうございます!

2014/01/16 11:19:04

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません