• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字連結中の三項演算子について)

三項演算子を使用した文字列連結のエラーについて

このQ&Aのポイント
  • 質問文章には、文字列連結の中で三項演算子を使用している部分があります。
  • 質問者は、この三項演算子を1行にまとめた場合にエラーが発生し、意図した結果が出力されないことに気づきました。
  • 質問者は、なぜエラーが発生するのかと、1行にした場合と2行に分けた場合の速度について知りたいと思っています。

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

三項演算子は優先順位が低いので、他の演算と合わせるときは括弧で括っておくのが無難です。 RTFM. http://www.php.net/manual/ja/language.operators.precedence.php (例) $str = 'aaaa'; $str .= $chk ? 'bbb' . 'ccc' : 'ddd' . 'eee'; ↓↓↓↓ $str = 'aaaa' . ($chk ? 'bbb' . 'ccc' : 'ddd' . 'eee'); 実行速度の違いはありません。厳密には測定誤差未満の差があると思いますが、全体の処理がけっして速くはないphpスクリプトでは問題にはなりません。速度より「ソースの読みやすさ」を優先してください。

rouningyo11
質問者

お礼

$buffer .= ',,'.$key.' 数: '.$value[0]['length'].' クラス: '. ($cachebool ? $class.',,<a href="' : 'なし,,<a href="'); これでちゃんとした結果が得られました。 速度に違いはないのですね、二行に分けた方が分かりやすそうなのでせっかくですが辞めておきます。すっきりしました、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.2

$buffer .= (',,'.$key.' 数: '.$value[0]['length'].' クラス: '. $cachebool) ? $class.',,<a href="' : 'なし,,<a href="'; こうなっているかもしれませんね。 $buffer .= ',,'.$key.' 数: '.$value[0]['length'].' クラス: '. ($cachebool) ? $class.',,<a href="' : 'なし,,<a href="'; こうしたらどうなりますか?

rouningyo11
質問者

お礼

それでも同じでした。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

$a=5; $a *= 2+3 ; と $a=5*2+3; が違うのは理解できますね? http://www.php.net/manual/ja/language.operators.precedence.php 優先順位をよく調べて、あなたの書いた「1行版」がどのように解釈されるかよく考えましょう

rouningyo11
質問者

お礼

なるほど、数学の四則演算のように優先順位があるんですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列連結演算子と浮動小数点型

    本に 「文字列型連結演算子では浮動小数点型等の出力形式を指定できません。出力をフォーマットしたい場合はprintf関数を利用する」 と記載されていますが、これ以上の詳しい説明が記載されていないので、それがちょっと分かりません。分かる方は教えてください。 私の仮定では、 --------------------------------------------- <?php $a=1.23; $b=1.23; print $a.$b //文字列連結演算子で$aと$bを繋ぐ。 ?> --------------------------------------------- 出力結果は1.231.23となる。それを回避するために --------------------------------------------- <?php $a=1.23; $b=1.23; printf("%f",$a.$b) //printf関数を使って出力をフォーマット ?> --------------------------------------------- 出力結果は1.231000となりますが、その解釈で正しいでしょうか。

    • ベストアンサー
    • PHP
  • checkboxの文字連結の方法を教えてください

    <INPUT name="ch" type="checkbox" value="1">1 <INPUT name="ch" type="checkbox" value="2">2 <INPUT name="ch" type="checkbox" value="3">3 <INPUT name="ch" type="checkbox" value="4">4 <INPUT name="ch" type="checkbox" value="5">5 選択してボタンを押すとチェックされた文字だけをカンマで連結して <a href="http://xxx.xx.ne.jp/xx.cgi?1,3,5">リンク</a> と表示したいのですがどのように書けばいいのでしょうか。 よろしくお願いします。

  • Excelマクロにて文字列連結

    現在Excelのマクロにて文字列の連結を行っているのですが、 繋いだ文字列を改行を付けて連結を行いたいです。 セルとセルの中の文字列を改行を付けて連結するにはどうしたらいいのでしょうか? 例 A1セル「あああ」 B1セル「いいい」 C1セル「あああ       いいい」 Worksheets(sheet1).Range("C1").Value = Worksheets(sheet1).Range("A1").Value + Worksheets(sheet1).Range("B1").Value をすると 「あああいいい」と1行で表示されてしまいます。     ↑ ここに改行を入れるにはどうしたらいいのでしょうか? 以上、宜しくお願いします。

  • 半角スペースが有効にならない。

    前のページで入力された値を取得するCGIですが、どうしても半角スペースを認識しません。 それどころか、半角スペースの後ろを一切消してデータを取得しています。 同じように作成したものはきちんと動いているのに…。 どこが間違ってるかご指摘お願いします。 ---------- #!/usr/local/bin/perl read(STDIN,$buffer,$ENV{'content_length'}); @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ tr/+/ /; $value =~ tr/+/ /; $key =~ tr/+/ /; print "Content-type:text/html\n\n"; print "$key<BR>\n"; print "<A HREF=./***.cgi>Back</A><BR>\n"; open (FH,">***.log"); @filew="$buffer\n"; print FH @filew; close(FH); exit; ---------- 以上です。よろしくお願いします。

    • ベストアンサー
    • CGI
  • method=GETの最大文字数

    <a href="***.cgi?key=value">という具合に、 データをGETで渡したいのですが、 valueに日本語をurlエンコードしたものを使いたいのです。 そのため、かなり文字数が多くなる場合もあるので、 GETでの最大文字数をご存知の方、よろしくお願いします。

    • 締切済み
    • CGI
  • utf-8環境で標準入力からの全角文字にマッチさせる方法

    utf-8でフォーム処理のコードを書いてます。 euc-jpで動作していた全角文字の正規表現がutf-8で動作しません。 単純な「$str =~ /あ/」のような書き方ではなく、別な指定方法が必要なのでしょうか? ・perl5.8 文字コードutf-8 標準入力側文字コードutf-8 use utf8; my(%POST,$buffer,$key,$value,@data_s); if ($ENV{'REQUEST_METHOD'} eq 'POST') { if ($ENV{'CONTENT_TYPE'} =~ /application\/x-www-form-urlencoded/i) { binmode STDIN; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @data_s = split(/&/,$buffer); foreach $buffer (@data_s) { ($key,$value) = split(/=/,$buffer); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg; if ( exists ($POST{$key}) ) { $POST{$key} .= '<>' . $value; } else { $POST{$key} = $value; } } } } binmode STDOUT,":encoding(utf8)"; print "Content-type: text/html; charset=utf-8\n\n"; print "<br>\n"; foreach $key (keys %POST) { if ($POST{$key} =~ /[0-9]/) { print "全角数字にマッチ<br>\n"; }###### print "$key = $POST{$key}<br>\n"; } exit;

    • ベストアンサー
    • Perl
  • 標準入力からのutf-8→euc-jpで一部文字化け

    これまでeuc-jpで作られていたHTMLフォームページをutf-8に変更したところ、フォームメールCGIの文字列処理で「~」「-」「 」(半角スペース)など一部の文字が文字化けするようになってしまいました。 Jcode.pm → Encodeに変更してみても症状は変わりませんでした。 Encodeは初めて使うのですが、過去ログを見てもよく分かりません・・・ どうぞお力添えをお願いします。 (1)下記のperlの記述方法で間違っている箇所はありますか? (2)正しく出力できる方法がありましたら、教えてください。 (3)http://oshiete1.goo.ne.jp/kotaeru.php3?q=1540626 で話されている、右側の折れ曲がった「~」はどうやって入力するのでしょうか? (3)perl側もutf-8で記述すれば、文字化けなど発生せずに処理出来るものなのでしょうか? ↓perl5.8 文字コードeuc-jp #!/usr/bin/perl use Encode;#### if ($ENV{'CONTENT_TYPE'} =~ /application\/x-www-form-urlencoded/i) { binmode(STDIN); read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @data_s = split(/&/,$buffer); foreach $buffer (@data_s) { ($key,$value) = split(/=/,$buffer); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg; $value = encode("euc-jp", $value);#### print "$key = $value\n"; } }

    • ベストアンサー
    • Perl
  • "ー"を含むとサーバーエラーになる

    HTMLのShift_JISに合わせて、Jcode.plで日本語コード変換のeucをsjisに変更したのですが、"ー"が$FORM{'key'}に含むとサーバーエラーになります。 どうしたら、sjisで"ー"など一部文字でエラーなく処理できるのでしょうか? アドバイスお願い致します。 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $name2 = $name; $value2 = $value; $FORM2{$name} = $value; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); #←ここを変更

    • ベストアンサー
    • CGI
  • 引数の文字列を全て連結する関数について

    var config={ connect:{character:',',expand:true,operator:':'} /* character……何の文字列で連結するか expand……展開するかどうか(true/false or number) 数字の場合は、展開する回数 operator……オブジェクト( {a:'a',b:'b'}など )の場合、キーと値を連結する文字列(key+operator+value) */ }; function connect(){ var connectString=config.connect.character,expand=config.connect.expand,operator=config.connect.operator,n=0; var subCallee=function(arg){ var text=arg,i; if(typeof arg=='object'){ var number=arg.length; switch(expand){ case true: text=subCallee(arg[0]); foreach(arg,function(i,key,value){ //i……ループ回数-1 key……Object:キー,Array:i value……値 if(i){ //0回目はすでに再帰呼び出し済み text+=connectString+subCallee(value); //再帰呼び出しで、展開 } }); break; case false: case 0: //展開回数0(0)もしくは、展開しない(false)場合 text=arg[0]; foreach(arg,function(s){ if(s){ text+=connectString+this; //展開しないので、そのまま引数をつなげる。 } }); break; default: if(typeof expand=='number'){ //expandがNumber型だった時 if(n>expand){ //nは最初に定義済み。展開回数が、指定された回数を越えた場合には、終了。 break; } foreach(arg,function(i,key,value){ i(i){ text+=connectString+subCallee(value); } }); n++; //何回展開したか、数える。 break; } return false; } } return text; }; return subCallee(arguments); //最初にargumentsを渡して、subCalleeを呼ぶ。 } このように定義されていますが、Array型とObject型はtypeofしても、共にobjectが帰ってくるため、判別できません。 何か判別する方法はないでしょうか? また、Object型の場合には、valueをkey+config.connect.operator+value(つまり、key:valueのような感じ)にしたいのですが、 text+=character+key+operator+subCallee(value); とし、 var a=config.connect; a.character='<>'; alert(connect({a:0,b:1})); としましたが、alert表示されたのは、 undefined<>b:1 でした; Object,Arrayの判定はしてないので、Arrayを入れてみたら↓ alert(connect(['a','b',['c',['d']]])); ↓ a<>1:b<>2:c<>1:d となっています。 展開順に考えて、以下のようになるのが妥当かな、と思ったのですが; まず、['a','b',[]] なので、 0:a<>1:b<>[] で、次に[]の中の、['c',[]]が展開されるので、 <>2:c<>[] 最後に、['d']が展開されるので、 <>1:d よって、 0:a<>1:b<>2:c<>1:d かな、と。。 実際はa<>b<>c<>dでいいので、ここは気にしなくていいですw Object,Arrayの判定方法と、Objectの場合、key:valueを取得する方法を、宜しくお願いします。

  • 正規表現の文字列否定

    すいません、PHPをたまたま使用しているので、 PHPのカテゴリで質問させていただきますが、 正規表現で特定の文字列の集合を まとめて否定することはできないのでしょうか。 例えば、<p class="hoge"><a href="test.html">aaa</a></p> という部分があって、 hogeのクラスが付いている行のhrefのURIだけ取得したいのですが、 <p class="hoge"">という部分が取り除けません。 イメージ的には[^(<p class=\"hoge\">)]という感じで、 否定できるのかな~と思っていたんですが、 これはできないんですよね。 まとまった文字列を否定することはでいないのでしょうか。 ご教授お願いいたします。

    • ベストアンサー
    • PHP