- ベストアンサー
php+mysql 重複した値を消す?
初めての投稿です。初心者なのでうまく表現できないのですが、よろしくお願いします。カテゴリーが mysql だったらすみません。 さて、mysqlからデータを呼び出します。 1.テーブル名 net <フィールド名> cityname ff10 ff11 ff12 <データ1> sel 1000 1000 2000 <データ2> pus 1500 1500 1000 <データ3> tpe 3000 2000 2000 2.テーブル名 cityname <フィールド名> cityname kuni cityname2 houmen <データ1> sel 韓国 ソウル 7 <データ2> pus 韓国 プサン 7 <データ3> cju 韓国 チェジュ 7 <データ4> tpe 台湾 台北 7 ブラウザー上にあらわしたいこと 韓国 ソウル プサン 台湾 台北 のように、重複する[韓国]をひとつだけにしたいのです。 下記コードの場合 韓国 ソウル 韓国 プサン 台湾 台北 となってしまいます。 $sql_houmen = "select kuni,cityname,cityname2 from cityname where houmen =7"; $sql_houmen = mb_convert_encoding($sql_houmen, "EUC-JP", "SJIS"); $result_houmen = mysql_query($sql_houmen); while($rec_houmen = mysql_fetch_array( $result_houmen, MYSQL_ASSOC )) {// foreach ($rec_houmen as $k=>$v) {// $rec_houmen[$k] = mb_convert_encoding($v,'SJIS','EUC-JP'); }// //$fsdateにデータがあるか確認 $sql_crr = "select crr,cityname from {$fsdate} where cityname like '%$rec_houmen[cityname]%' and cls='y' and crr = '{$crr}'"; $sql_crr = mb_convert_encoding($sql_crr, "EUC-JP", "SJIS"); $result_crr = mysql_query($sql_crr); if (mysql_num_rows($result_crr) > 0) {// echo "$rec_houmen[kuni]$rec_houmen[cityname2]"; }// }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
fetchしたレコードの国名が一度出てきたかを格納する配列を用意しておき、既出なら国名でなく、その文字数分の空白を出力するようにしてみました。デバッグしてないので、うまくいかなかったらすみません。 unset $kuni_selected; $sql_houmen = "select kuni,cityname,cityname2 from cityname where houmen =7"; $sql_houmen = mb_convert_encoding($sql_houmen, "EUC-JP", "SJIS"); $result_houmen = mysql_query($sql_houmen); while($rec_houmen = mysql_fetch_array( $result_houmen, MYSQL_ASSOC )) {// foreach ($rec_houmen as $k=>$v) {// $rec_houmen[$k] = mb_convert_encoding($v,'SJIS','EUC-JP'); }// //$fsdateにデータがあるか確認 $sql_crr = "select crr,cityname from {$fsdate} where cityname like '%$rec_houmen[cityname]%' and cls='y' and crr = '{$crr}'"; $sql_crr = mb_convert_encoding($sql_crr, "EUC-JP", "SJIS"); $result_crr = mysql_query($sql_crr); if (mysql_num_rows($result_crr) > 0) {// if (isset($kuni_selected($rec_houmen[kuni]))) { echo str_repeat(" ",strlen($rec_houmen[kuni])) . "$rec_houmen[cityname2]"; } else { echo "$rec_houmen[kuni]$rec_houmen[cityname2]"; $kuni_selected($rec_houmen[kuni]) = TRUE; } }// }
その他の回答 (3)
- ham_kamo
- ベストアンサー率55% (659/1197)
No.1です。 大変失礼いたしました。全くデバッグしてなかったので、やはり誤りがありました。(最近PHPやCでなくVBでコードを書く機会が多く、配列を[]でなく()で書くという初歩的なミスを犯していました) 最後のif文を以下のように訂正いたします。 if (isset($kuni_selected[$rec_houmen[kuni]])) { echo str_repeat(" ",strlen($rec_houmen[kuni])) . "$rec_houmen[cityname2]"; } else { echo "$rec_houmen[kuni]$rec_houmen[cityname2]"; $kuni_selected[$rec_houmen[kuni]] = TRUE; }
お礼
No.1さま 出来ました!!!何故か unset $kuni_selected; を抜かしてみたら、希望通りの表示になりました。本当にありがとうございました。 1週間位悩んでいたのですが、これですっきりです。 本当に感謝です!
- yambejp
- ベストアンサー率51% (3827/7415)
まぁ折角なのでMySQL側でやる方法を。 SET @KUNI=""; SELECT @KUNI:=IF(kuni=@KUNI,"",`kuni`) AS `kuni`,`cityname2` FROM `cityname` INNER JOIN `net` ON `cityname`.`cityname`=`net`.`cityname`;
お礼
yambejp様 レスありがとうございました。まだ初心者なので、No.1さんの回答が入りやすかったので、とりあえずNo.1さんの方法を取らせていただきました。今後勉強していきたいと思います。
- moon_night
- ベストアンサー率32% (598/1831)
//$fsdateにデータがあるか確認 が何をしているか分かりませんが、 cityname.cityname が net.cityname にある場合だけデータを出力したいということでしょうか? $data = array(); $sql = "select cityname.cityname,kuni,cityname2 from cityname"; $sql .= " left join net on cityname.cityname = net.cityname "; $sql .= " where houmen =7 and net.cityname is not null"; $rs = mysql_query($sql); while($row=mysql_fetch_array($re)){ $data[$row['kuni']][] = $row['cityname2']; } foreach($data as $k => $v) { print "$k "; $i=0; #フラグ foreach ($v as $d) { if ($i){print' ';} #スペースを入れる print $d; print "<br>\n"; $i++; } }
お礼
moon_night様 レスありがとうございました。yambejp様と同じで、まだ初心者のため、No.1さんの回答が入りやすかったため、とりあえずNo.1さんの方法を取らせていただきました。今後勉強していきたいと思います。
補足
ham_kamo 様 レスありがとうございました。初心者なので一番わかりやすそうでしたので、試してみたのですが上手くいきません。。。(ちょっとコードを変えるなり試行錯誤してみたのですが。。) 「レコードの国名が一度出てきたかを格納する配列」とは、$kuni_selected($rec_houmen[kuni])でしょうか?そこに1番最初の「韓国」が入ったとして、その後の$kuni_selected($rec_houmen[kuni]) = TRUE;がわかりません。。。(スミマセン) 私のやりたい事の通りなのですが、もう一度お願いできませんでしょうか?本当に申し訳ないのですが、よろしくお願いします。