• ベストアンサー

初歩的な質問ですが、どなたかアドバイスお願いいたします。

初歩的な質問ですが、どなたかアドバイスお願いいたします。 演算子(+、-)などを、文字列に代入し整数と連結しても、演算子として扱えないのでしょうか? 複数の演算子を入れ替えて使用したいので、変数へ代入して使用したいのですが・・・・ 例) $sig = '+'; $num = 1; $num2 = 2; $str = $num. $sig. $num2; if ( $str == 3 ){ echo"OK"; } else { echo"NG"; } 上記、例だと「NG」が出力されてしまいます。 よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.1

単純に変数をくっつけても "1+2"という文字として解釈されてしまいます。 コードとして実行したい場合は 「実行したい式」をつくってeval()を使用します。 http://jp2.php.net/manual/ja/function.eval.php ※どうしてもできない場合は補足してください。

cwm474
質問者

お礼

早速のご回答ありがとうございました。 eval('$str = '. $str. ';'); を追加してみたら、うまくいきました。 ありがとうございます!

関連するQ&A

  • = $argv[1];はどんな働きがありますか!?

    <?php // stringcast.php if (!isset($argv[1])) { exit; } $num = $argv[1]; if ($num == 100) {  ←(1) echo "num is 100", PHP_EOL; } else { echo "num is not 100",PHP_EOL; } このプログラムを %php stringcast.php100 のように実行する、引数の100はPHP文字列型として渡されます。  したがって、(1)の比較では、文字列"100"の入って変数$numと、整数100が比較されるため、 文字列"100"は整列100へとキャストされまた後、比較演算が実行されます。  今回は、動作の結果に違いはありませんが、ここで整数同士を比較しているつもりでも実際には 文字列を整数の比較が行われ、キャストが発生している、という挙動を把握しているか、していない かではなく大きな違いがあります。引数とし期待している値の型が決まっている場合、明示的にキャ ストを行い、厳密な比較演算子(===など)を用いるほうが安全です。 -------------------------------------------------------- 以上、参考書をまるごと入力しました。  そこで $num = $argv[1];で!$argv[1]とはこのプログラムではどんな働きがあるのでしょうか!?  ($argv[1];を$numに代入だと思います。間違っていたなら御免なさい。)  宜しくお願いします。  なお・批判的なご回答はお控えくださいませ。  

    • ベストアンサー
    • PHP
  • コンテキストについて

    パターンマッチを用いて、変数$numに、文字列$strが正の整数の場合はその値を代入し、そうでない場合はデフォルト値として定数を代入したいのですが、 ($num) = ($str =~ /^([1-9][0-9]*)$/) || 1; としても、正の整数としてマッチした場合でも、||の影響で||の左辺がスカラーコンテキストとして評価され、真値としての1が代入されて上手くいきません。 上記の用件を1行で満たすPerlらしいスクリプトがあったら是非教えてください。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 数字の分割方法について

    お世話になります。 変数$numに1~16までの数字をランダムに区切らずに代入した時、 この変数$numの値を1つずつ取り出す関数、もしくは処理方法はございますでしょうか?? ■例■ $num = 12378910; $Num = ホニャララ関数($num); echo $Num[6] "10" もしお分かりになる方がおられましたら、 ご教授をお願い申し上げます。

    • 締切済み
    • PHP
  • 複数の数字を計算

    下記のプログラムだと、 1 tasu 1 tasu 1 tasu 1 tasu 1 をしても答えは2となります。 入力された数字を一気に計算できる方法を教えて下さい。 また、必ず5の値を入力しなくては、いけないのでは無くて、5つ以下ならOKにしたいです。 コマンドプロンプト上で自ら入力し動くプログラムを作成中です。 例: 1 tasu 1 tasu 1 tasu 1 tasu 1  答え5      1 tasu 1 tasu 1 答え3 /*演算子チェックと演算実行*/ if (args[1].equals("tasu")){ /*演算子チェック*/ ans1 = num1 + num2; }else if (args[1].equals("hiku")){ /*演算子チェック*/ ans1 = num1 - num2; /* hiku 演算実行*/ }else if (args[1].equals("kake")){ /*演算子チェック*/ ans1 = num1 * num2; /* kake 演算実行*/ }else if (args[1].equals("waru")){ /*演算子チェック*/ if(num2 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num1); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num2); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子1: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[3].equals("tasu")){ /*演算子チェック*/ ans1 = num2 + num3; }else if (args[3].equals("hiku")){ /*演算子チェック*/ ans1 = num2 - num3; /* hiku 演算実行*/ }else if (args[3].equals("kake")){ /*演算子チェック*/ ans1 = num2 * num3; /* kake 演算実行*/ }else if (args[3].equals("waru")){ /*演算子チェック*/ if(num3 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num2); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num3); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子2: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[5].equals("tasu")){ /*演算子チェック*/ ans1 = num3 + num4; }else if (args[5].equals("hiku")){ /*演算子チェック*/ ans1 = num3 - num4; /* hiku 演算実行*/ }else if (args[5].equals("kake")){ /*演算子チェック*/ ans1 = num3 * num4; /* kake 演算実行*/ }else if (args[5].equals("waru")){ /*演算子チェック*/ if(num4 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num3); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num4); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子3: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[7].equals("tasu")){ /*演算子チェック*/ ans1 = num4 + num5; }else if (args[7].equals("hiku")){ /*演算子チェック*/ ans1 = num4 - num5; /* hiku 演算実行*/ }else if (args[7].equals("kake")){ /*演算子チェック*/ ans1 = num4 * num5; /* kake 演算実行*/ }else if (args[7].equals("waru")){ /*演算子チェック*/ if(num5 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num4); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num5); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子4: kake waru tasu hiku の中から入力して下さい"); }

    • ベストアンサー
    • Java
  • rubyにおける変数と代入のメモリの様子について

    Rubyの変数と代入演算は、メモリについてどのような扱いになっているのでしょうか。2点ほど疑問電があります。 1点目:代入演算は変数にアドレスを渡しているのか RubyLifeのRuby入門のサンプルをみて学習していたところ疑問がわきました。 http://www.rubylife.jp/ini/var/index4.html を参照しながら示します。 str1 = "Tokyo" str2 = str1 str1 << ",Japan" とやるとstr1もstr2も"Tokyo,Japan"となることから、rubyでの代入演算はアドレスを代入してると考えました。 2点目:新しくオブジェクトを代入すると別メモリ領域において、そのアドレスを代入しているのか str1 = "Tokyo" str2 = str1 str1 = "Osaka" とやると、str1は"Osaka"、str2は"Tokyo"となります。 前述の参照渡と考えるとstr2も"Osaka"となっているはずですが違いました。 ここで解説に(引用はじめ) なお2つの変数が同じオブジェクトを指し示した後で、どちらかのオブジェクトに新しいオブジェクトを 代入した場合は、代入された変数が指し示すオブジェクトだけが変更されるだけです。(引用おわり) とあります。 このことをふまえると、新しいオブジェクトを変数に代入するというのは、別のメモリ領域をつくってデータを置いてから、そのアドレスを変数に代入している、と考えました。 これら2つの考えと実際の仕組みは一致しているのでしょうか、と言うのが質問です。 質問点をまとめると、Rubyにおいて変数に対して ・代入演算はアドレスを代入しているのか(Cでいうポインタの扱いなのか) ・新しいオブジェクトを代入するときには、新メモリ領域を作ってデータを入れてそのアドレスを代入しているのか という点です。 ついこの間はじめたばかりの初心者ですが、どうかご教授よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 超初歩的質問で恐縮ですが、シェルの環境変数

    初歩の例文です。 ーーーーーーーーーーーーーーーーーー 1: $ echo $home 2: /Old 3: $ HOME=/New echo "My Home is $HOME"  #代入文 + 空白 + echoコマンド 4: My Home is /New #←ここ!! 5: $echo $HOME 6: /Old ーーーーーーーーーーーーーーーーーー 質問1) "ここ!!"、で示した4行目が、実際にやってみると、 My Home is /Old となります。例文が間違っているのでしょうか? 質問2) 例文で、環境変数HOMEの値が、Newを代入してもOldのままなのは、サブシェルが起動しているからかと思うのですが、なぜ、3行目のように、(代入文)+空白+(echoコマンド)とすると、サブシェルが起動するのでしょうか?(代入文)だけだとサブシェルは起動せずに環境変数HOMEの値がNewに変わりますが。

  • 変数名の連結

    以下のような配列があるとします。 $str[0] = aaa; $str[1] = bbb; $str[2] = ccc; foreachでまわし変数名を連結し代入するというような事は可能なの でしょうか? foreach ($str as $key => $val) { //$keyをechoすると012と表示 //ここで変数名を$data0,$data1のようにしたいがうまくいかない $data . $key = $val; //配列にするぶんには正常に動作しました $data[$key] = $val; }

    • ベストアンサー
    • PHP
  • php次の画像の解釈について $num1 に5を

    php次の画像の解釈について $num1 に5を代入する $num1はすでに5になっていて、 条件の中で5===5の条件式がブール型によって trueだから次の処理のに進む $str に "ok"を代入する その$strに代入された中身をechoによって出力する それでOKが出力された この認識であっていますか?

    • ベストアンサー
    • PHP
  • php次の画像の解釈について $num1 に5を

    php次の画像の解釈について $num1 に5を代入する $num1はすでに5になっていて、 条件の中で5===5の条件式がブール型によって trueだから次の処理のに進む $str に "ok"を代入する その$strに代入された中身をechoによって出力する それでOKが出力された この認識であっていますか?

    • ベストアンサー
    • PHP
  • 友達に問題を出されて・・・、助けてください。

    JAVAのプログラムで友達から問題を出されました。 内容は、 「1.キーボードから整数を入力し、int型の変数に代入する。 2.入力された整数が0ならば、「その数は0です」と表示する。 3.入力された整数が0でなければ、「その数は0ではありません」と表示する。」 これだけならIF文の条件分岐で解決できるのですが、条件として 「 使用する演算子は、表4-1の+、-、*、/のみであること。」 が、加えられています・・・。 これだとアイデアが出てきません。 すみませんが、助言してください。

専門家に質問してみよう