• ベストアンサー

繰り返しのコードをまとめて簡略化したい

以下のようなPHPを作成しました。 が、同じようなコードが繰り返し使われていて、 なんとか簡略化できないかなと考えています。 例えば、↓が10回出てくる。 LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 なにかやり方あるのでしょうか。 見当違いのとこを言っていたらすいません。 ****************************************************** 作成したPHP 環境:PHP5.2 Apache2.2 SQLserver5 ****************************************************** <a href="clip.php?x=a">あ</a><br> <a href="clip.php?x=ka">か</a><br> <a href="clip.php?x=sa">さ</a><br> … <a href="clip.php?x=wa">わ</a><br> <?PHP $cont = mssql_connect("サーバ名","ユーザ名","パスワード"); mssql_select_db('[DB名]', $cont); if ($_GET['x']=='a') { // あ行 $sql = "select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE (氏名 LIKE N'あ%' OR 氏名 LIKE N'い%' OR 氏名 LIKE N'う%' OR 氏名 LIKE N'え%' OR 氏名 LIKE N'お%') ORDER BY 氏名"; } if ($_GET['x']=='ka') { // か行 $sql = "select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE (氏名 LIKE N'か%' OR 氏名 LIKE N'き%' OR 氏名 LIKE N'く%' OR 氏名 LIKE N'け%' OR 氏名 LIKE N'こ%') ORDER BY 氏名"; } if ($_GET['x']=='sa') { // さ行 $sql = "select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE (氏名 LIKE N'さ%' OR 氏名 LIKE N'し%' OR 氏名 LIKE N'す%' OR 氏名 LIKE N'せ%' OR 氏名 LIKE N'そ%') ORDER BY 氏名"; } ……………た行~ら行も同様のコードなので省略………………… if ($_GET['x']=='wa') { // わ行 $sql = "select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE (氏名 LIKE N'わ%' OR 氏名 LIKE N'を%') ORDER BY 氏名"; } $rc = mssql_query($sql,$cont); print("</table>"); while ($array = mssql_fetch_array($rc)) { print("<tr><td>"); print "".$array["氏名"].""; print("</td><td>"); print "".$array["住所"].""; print("</td><td>"); print "".$array["番号2"].""; print("</td></tr>"); } print("</table>"); mssql_close($cont); ?>

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

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

配列を使う例です。 <?PHP $whereArray=Array( "a"=>Array("あ","い","う","え","お"), "ka"=>Array("か","き","く","け","こ"), "sa"=>Array("さ","し","す","せ","そ") ); $_GET['x']="a"; //テスト $whereStr=""; if(is_array($whereArray[$_GET['x']])){ foreach($whereArray[$_GET['x']] as $val){ $whereStr.=($whereStr==""?"":" OR ")."氏名 LIKE N'{$val}%'"; } $whereStr="AND ( {$whereStr} )"; } $sql = <<<eof select 氏名, 住所, LEFT(番号,LEN(番号)-2) + '-' + RIGHT (RTRIM(番号), 2) AS 番号2 from テーブル名 WHERE 1 {$whereStr} ORDER BY 氏名 eof; print $sql; ?> ちなみにか行の「がぎぐげご」など濁音半濁音関係は大丈夫ですか?

smorgas030
質問者

お礼

回答ありがとうございます。 半濁音忘れていました。ご指摘ありがとうございます。 早速修正しましたが、エラーメッセージが出ました。 *******エラーメッセージ************** Parse error: syntax error, unexpected T_VARIABLE in C:\Program Files\Apache…test.php on line 70 ************************************* クエリを実行できないようなメッセージかと思います。 いただいたコードがよくわからなかったので、 よかったらご教授ください。 ************************************* $whereArray=Array( "a"=>Array("あ","い","う","え","お"), "ka"=>Array("か","き","く","け","こ"), "sa"=>Array("さ","し","す","せ","そ") ); ↑こちらはArrayを二回使っているということでしょうか。 通常であれば、"a"=> "あ"のように使うのかと思いますが、 こちらの場合は、"a"が"あ"から"お"まで置き換える?ということでしょうか。 $_GET['x']="a"; //テスト $whereStr=""; if(is_array($whereArray[$_GET['x']])){ foreach($whereArray[$_GET['x']] as $val){ $whereStr.=($whereStr==""?"":" OR ")."氏名 LIKE N'{$val}%'"; } $whereStr="AND ( {$whereStr} )"; } ↑こちらは、(1)IF文の中に(2)foreach文を入れているのでしょうか。

その他の回答 (2)

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

test.php の70行目(もしくは69行目)に何がかいていあるのかが 書いてありませんので状況がわかりかねます。 とにかくサンプルスクリプトをそのまま実行していただき、 動作したら、ホンチャンスクリプトに組み込むという2段階のテストを してください。 >こちらはArrayを二回使っているということでしょうか。 Arrayの中にArrayを入れることができます。 データ管理上常套的なものですので覚えておくと役にたつとおもいます。 >こちらは、(1)IF文の中に(2)foreach文を入れているのでしょうか。 IFをいれてる理由はforeachでまわす変数が配列でないときは エラーになるからです。 foreachの中でやっているのは三項演算ってやつですね。 ifでもかけるのでなれないうちは自分のわかる書式をご使用ください

smorgas030
質問者

お礼

回答ありがとうございます。 foreachがよくわからないので、 ifでやってみます。 ありがとうございました。

回答No.1

配列に入れて繰り返しを書くとだいぶ違います。 $hoge = array( "氏名 LIKE N'あ%' OR 氏名 LIKE N'い%' OR 氏名 LIKE N'う%' OR 氏名 LIKE N'え%' OR 氏名 LIKE N'お%'", "氏名 LIKE N'か%' OR 氏名 LIKE N'き%' OR 氏名 LIKE N'く%' OR 氏名 LIKE N'け%' OR 氏名 LIKE N'こ%'", ... ); これでも1行で5回(あ~お)ずつ繰り返されていますからもっと簡略化できるでしょう。

smorgas030
質問者

お礼

回答ありがとうございます。 配列(array)というのがあるのですね。 はじめてしりました。 ありがとうございました。

関連するQ&A

専門家に質問してみよう