• ベストアンサー

文字列連結パターンが多数ある場合

文字列が「A B C D E F」とあるとします。 これらはDB上で連結するかしないか(0しない1する)のフラグをそれぞれ持っています 例えば取得したふらぐがA(1)B(1)C(0)D(0)E(1)F(0)だったら 連結後の表記は「A、B、E」となります。 if分でずらずら条件を記述し、連結することは可能ですが、何とかして(ループしてとか?)短いステップで実装したいと考えているのですが全く良い案が浮かびません。 何か私に良い方法をご教授していただけないでしょうか。 よろしくお願いいたします

質問者が選んだベストアンサー

  • ベストアンサー
  • mpx
  • ベストアンサー率71% (149/209)
回答No.3

DBから読み込み後の処理でも良いのなら 以下でも出来そうです。 <?php // DBからの読み込み結果が下記のように$resultに格納されているとします $result = array("A"=>1, "B"=>1, "C"=>0, "D"=>0, "E"=>1, "F"=>0); // 下記の1行で! print implode(", ", array_keys($result,1)); ?>

yyckeien
質問者

お礼

ありがとうございました この処理を使わせていただきます

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

#1さんの回答のようにSQLでやる方が 速いと思いますよ。 仮にフィールド名がA,A_F,B,B_Fのように なっていると仮定すると、次のようにしては 如何でしょう。 【MySQL】 select concat (case when A_F=1 then A else '' end ,case when B_F=1 then B else '' end ,case when C_F=1 then C else '' end 以下略 ) from ・・・ 【Oracle】 select case when A_F=1 then A else '' end || case when B_F=1 then B else '' end || case when C_F=1 then C else '' end || 以下略 from ・・・ 文字列の連結はDB毎に違いますし、条件に よる選択文も異なることがあるので、上記 以外のDBの場合は別途、考える必要が あります。 どうしてもPHPでやりたいなら、フィールド名を 工夫して、数値化するとか、配列に仕込んで インデックスで回す方法があります。 $結果セット ← クエリを実行して得たもの $名前配列 = array("A","B","C",・・・); $フラグ配列 = array("A_F","B_F",・・・); $結合結果 = ""; for ( $i = 0 ; $i < 6 ; $i++ ) {   if ( $結果セット[$フラグ配列[$i]] == 1 ) {     $結合結果 = $結合結果 . $結果セット[$名前配列[$i]];   } } 暇があれば両方試してみてください。レコード数が 少ないとよく分からないかも知れませんが、多い 場合はハッキリ、前者が有利だと分かりますよ。

yyckeien
質問者

お礼

ありがとうございました 参考にさせていただきます

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

いまいち状況がわからないのですが たとえばDBで管理しているのがMySQLだとしたら create table tbl(data varchar(10),flg tinyint); insert into tbl values('A',1),('B',1),('C',0),('D',0),('E',1),('F',0); select group_concat(data separator '、') as kekka from tbl where flg=1; みたいな感じでSQL側で処理してみては?

yyckeien
質問者

お礼

ありがとうございます 参考にさせていただきます