• ベストアンサー

条件式の変数化

phpにて、いくつかのキーワードを変数で設定しておき、 文中にそのキーワードがあるかどうか判定し、そのキーワードによって処理を変えていくというプログラムを作成しています。 プログラムは、strposによるキーワード判定と、switchによる処理を組み合わせたものです。 //【キーワードの設定】 //「暑い」 $atui = "暑い"; $atui2 = "あつい"; $atui3 = "あっつい"; $atui4 = "あつーい"; //「寒い」 $samui = "寒い"; $samui2 = "さむい"; $samui3 = "さっむーい"; $samui4 = "さむーい"; //【判定対象の文章】 $word = "外は暑いなあ" switch (true) { //【「暑い」の場合の処理】 case (strpos($word, $atui1) !== false) || (strpos($word, $atui2) !== false) || (strpos($word, $atui3) !== false) || (strpos($word, $atui4) !== false) || : echo "今日は暑いですね"; break; //【「寒い」の場合の処理】 case (strpos($word, $samui1) !== false) || (strpos($word, $samui2) !== false) || (strpos($word, $samui3) !== false) || (strpos($word, $samui4) !== false) || : echo "今日は寒いですね"; break; } キーワード認識に幅を持たせたいので変数を何個も設定しています。 上記コードのように『暑い』だったら、「あつい」「あっつい」「あつーい」「アツイ」などをそれぞれ個別に変数化し いずれかが含まれていたら「暑い」の処理を実行するという感じです。 キーワードが少ないうちはいいんですが、多くなってくると 個別に設定している変数が膨大になってきて収集がつかなくなってきている状態です。 条件式も、複数のキーワードを組み合わせた判定を書こうとすると、ものすごい長さになってしまいますし… $atui = "暑い" or "あつい" or "あっつい" or "あつーい" or "アツイ"; という感じに、うまく一つのキーワードで一つの変数にまとめることはできないでしょうか? (ちなみに、上記のように書いて条件式に使ってみたのですがうまくいきませんでした…) なにか良い方法がありましたらご助力頂けると幸いです。 よろしくお願いします。

  • rai28
  • お礼率72% (13/18)
  • PHP
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

そういう複雑な条件で処理する場合は、preg_match を使うのが簡単です。 $atui = "/暑い|あつい|あっつい|あつーい|アツイ/"; if (preg_match($atsui, $word)) echo "今日は暑いですね"; 詳しくは「正規表現」について勉強してほしいのですが、 例えば、 $atui = "/(暑|[あア][っッ]?[つツ])ー?[いイ]/"; としておけば、これだけで質問者さんが示したものだけでなく 「暑ーい」や「あっツーい」なども検出できるようになります。

rai28
質問者

お礼

こちらの方法でうまく動作させることができました、ありがとうございます!! この機会に正規表現について、もっと理解を深めていきたいと思います。

その他の回答 (3)

noname#119957
noname#119957
回答No.4

そうですね、正規表現と関数の方がいいですね。

noname#119957
noname#119957
回答No.2

配列で、atui[]に調べる文字列を全部入れておいて、始めから終わりまで チェックする。 do { if(atui[x]=="あつい")echo "あつい" break; x++; } while(xxxx) みたいにすれば? または、 do { switch (atui[x]) case: atui[x]=="あつい" break: x++; }while() 適当に書きましたので文法は、PHPユーザ会とかで調べてください。

rai28
質問者

お礼

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

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

先にstr_replaceしてからチェックしてみては?

rai28
質問者

お礼

回答ありがとうございました!

関連するQ&A

  • switchの大量分岐の高速化

    いつもお世話になっております。 phpにて、文中にキーワードがあるかどうか判定し、そのキーワードによって処理を変えていくというプログラムを作成しています。 preg_matchまたはstrposによるキーワード判定と、switchによる処理を組み合わせたものです。 //判定対象となる文章 $text = "判定対象となる文章"; //判定キーワードの設定 $word1 = "/キーワード1|きーわーど1|keyword1/"; $word2 = "/キーワード2|きーわーど2|keyword2/"; . .(中略) . $word30 = "/キーワード30|きーわーど30|keyword30/"; //判定処理 switch (true) { case preg_match($word1, $text): echo "キーワード1に該当します" break; case preg_match($word2, $text): echo "キーワード2に該当します" break; . .(大量のcase) . case preg_match($word30, $text) && preg_match($word1, $text): echo "キーワード1かつキーワード30に該当します" break; }; ざっと書くとこのような構造になっています。 しかしキーワード分岐がかなり多岐に渡っている状態で、switch文の後半のcaseに該当する場合になってくると速度もかなり遅く感じます。 どうにかもう少し高速化したいなあと考えているのですが、何か良い方法はありますでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • break後も変数を維持するには、どうすればいいで

    break後も変数を維持するには、どうすればいいでしょうか? switch文とかで、breakした後も、変数へ格納した値を利用するには、どうすればいいのでしょうか? switch($hoge) {  case 0:   $a=24;   break;  case 1:   echo $a;//ここで、24と表示させたい   break; static変数とかを使うのでしょうか?

    • ベストアンサー
    • PHP
  • PHPの不等式に変数を使う

    いつもお世話になります PHPの不等式に変数を使うことは出来ますでしょうか? 例えば $a = 'huga'; $b = 'huga'; if($a == $b){ echo 'hoge'; } 結果 hoge 右辺と左辺の間、不等式を変数にしたいです $a = 'huga'; $b = 'huga'; $c = '==' if($a $c $b){ echo 'hoge'; } 期待する結果 hoge 上のソースはもちろんパースエラーとなり成り立ちません 型変換や考えられるキーワードで検索したのですが、出てきませんでした 下のように strpos()、strstr()等で$cの内容を解析して、条件分岐すれば期待の結果が出せるのは分かります if( strpos($c,'==') !== false && $a == $b){ echo 'hoge'; } (上記で成り立つのは分かります) 教えていただきたい内容は、「不等式を変数で成り立たせる方法」です $c= '=='; PHPに詳しい方お教えいただけると嬉しいです

    • ベストアンサー
    • PHP
  • 変数がうまく使えません。

    下記のプログラムについてなんですが、 while(handle != 4);←ここでブロック外にて変数を使って いる為エラー出てしまうんですけど、 入力した値が4だった場合処理を終了、それ以外は 「1.入金 2.出金 3.照会 4.終了」と表示される所から 処理を繰り返したいんですけど、 上手く変数を使う方法ってないですか? do{ System.out.println("1.入金 2.出金 3.照会 4.終了"); System.out.println("どの処理を行いますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int handle = Integer.parseInt(str); switch(handle){ case 1: atm.Receive(); break; case 2: atm.Pay(); break; case 3: atm.show(); break; default: break; } }while(handle != 4);

    • ベストアンサー
    • Java
  • PHPについて質問です。(switch文)

    PHPについて質問です。(switch文) 前のフォームのテキストフィールドから受け取った"fn"の値を使ってswhitch文で判定したいです。 <?php $a = $_POST['fn']; switch( $a ){ //←ここが予期せぬエラーとでました。 case 1: echo '$aは1です。'; break; case 2: echo '$aは2です。'; break; case 3: echo '$aは3です。'; break; default: echo '$aは1・2・3のいずれでもありません。'; } ?> どこらへんがいけないのですか?

    • ベストアンサー
    • PHP
  • 見たことの無い式で解かりません。

    教えていただきたいのですが 以下のようなプログラムがあったのですが、 |= が良くわからないのですが、変数bには なにが入るのでしょうか? switch(変数a) { case 定数a: 変数b |= 's'; break; } 申し訳ありませんがよろしくお願いします。

  • php修正について

    phpで下記のように書いていますが $value = $row_DetailRS1['shop']; switch ($value) { case "01": echo "愛宕店"; break; case "02": echo "伊形店"; break; case "03": echo "出北店"; break; case "04": echo "惣領店"; break; case "05": echo "東郷店"; break; case "06": echo "東出北店"; break; case "07": echo "無鹿店"; break; case "08": echo "柳沢店"; break; default: echo "未設定"; break; } "09"で"細島店"を追加したいのですがどこを追加修正すれば良いでしょうか? 教えてください。

    • ベストアンサー
    • PHP
  • <PHP>2つの条件を満たす switch 

    下記のようなソースの場合は条件が一つしか指定できません。田中さんとかの苗字だけではなく、例えば、東京・田中さんであれば”ペットはいぬ”と言った感じ値を返したいのですが・・・ caseの横にandなどを使えば言いのかなとは思ったのですが、HP等が見つかりません。初歩的な質問だとは思いますが、ご指導をお願いします。 --------------------- <?php $type = "田中さん"; switch ( $type ) { case "鈴木さん": echo 'ペットはいぬ'; break; case "佐藤さん": echo 'ペットはきじ'; break; case "田中さん": echo 'ペットはさる'; break; } ?>

    • ベストアンサー
    • PHP
  • ひらがなの小文字を大文字に変換する方法

    ひらがなの「ぁ」とか「ゃ」とかを「あ」とか「や」に変換したいと思っています。 switch ($bar) { case 'ぁ': echo "あ"; break; case 'ぅ': echo "う"; break; case 'ぉ': echo "お"; break; } とやるのは、あまりスマートではないですよね…。 何か良い方法はありませんか? よろしくお願い致します。

    • 締切済み
    • PHP
  • ISSETで変数に値が入っていないか確認するのですが

    ISSETで変数に値が入っていないか確認するのですが <? $a = ''; if (isset($a)) { echo "何か入っています。"; } else { echo "空っぽです。"; } ?> 上のコードで「何か入っています。」がエコーされてしまいます。issetは値が入っていなければFALSEを返すと思ったのですが違うようなのでちょっと混乱してしまったのですが、これがマニュアルに書いてある「NULL に設定されている変数を調べた場合、 isset() はFALSE を返します。 」、ということなのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう