dポイントプレゼントキャンペーン実施中!

$buffer = "";
foreach($data as $key => $value){
$class = $value[0]['class'];
$classbool = !empty($class);
$buffer .= ',,'.$key.' 数: '.$value[0]['length'].' クラス: ';
$buffer .= $classbool ? $class.',,<a href="' : 'なし,,<a href="';
この後$bufferに連結でURLなどが続く~~~~~~~~~~~~~~

前後は省略していますがこういう式があります。コンマ文字は出力する際に改行に使っていますので気にしないでください。
この$bufferに連結代入している最後の二行部分を三項演算子を使って

$buffer .= ',,'.$key.' 数: '.$value[0]['length'].' クラス: '. $cachebool ? $class.',,<a href="' : 'なし,,<a href="';

こう1行でやるとエラーは出ませんが結果がおかしくなります。
上記の二行に分けたものなら結果はちゃんと

数: 5 クラス: なし

<a href="http://~~~

や、
数: 23 クラス: test

<a href="http://~~~

と出力されますが、1行バージョンだと「~<a href="」までが抜け落ちていきなり

http://~と出力されます。

最後の一行にした $buffer .= ~ の部分が全くなかったことにされているような感じです。

どうしてこうなるんでしょうか?
また、一行にした場合と二行に分けた場合どっちが速いんでしょうか?
どなたかご教授宜しく願います。

A 回答 (3件)

三項演算子は優先順位が低いので、他の演算と合わせるときは括弧で括っておくのが無難です。



RTFM.
http://www.php.net/manual/ja/language.operators. …

(例)
$str = 'aaaa';
$str .= $chk ? 'bbb' . 'ccc' : 'ddd' . 'eee';
↓↓↓↓
$str = 'aaaa' . ($chk ? 'bbb' . 'ccc' : 'ddd' . 'eee');


実行速度の違いはありません。厳密には測定誤差未満の差があると思いますが、全体の処理がけっして速くはないphpスクリプトでは問題にはなりません。速度より「ソースの読みやすさ」を優先してください。
    • good
    • 0
この回答へのお礼

$buffer .= ',,'.$key.' 数: '.$value[0]['length'].' クラス: '. ($cachebool ? $class.',,<a href="' : 'なし,,<a href="');

これでちゃんとした結果が得られました。
速度に違いはないのですね、二行に分けた方が分かりやすそうなのでせっかくですが辞めておきます。すっきりしました、ありがとうございました。

お礼日時:2014/05/08 09:02

$buffer .= (',,'.$key.' 数: '.$value[0]['length'].' クラス: '. $cachebool) ? $class.',,<a href="' : 'なし,,<a href="';



こうなっているかもしれませんね。

$buffer .= ',,'.$key.' 数: '.$value[0]['length'].' クラス: '. ($cachebool) ? $class.',,<a href="' : 'なし,,<a href="';

こうしたらどうなりますか?
    • good
    • 0
この回答へのお礼

それでも同じでした。

お礼日時:2014/05/08 09:00

$a=5;


$a *= 2+3 ;

$a=5*2+3;
が違うのは理解できますね?

http://www.php.net/manual/ja/language.operators. …
優先順位をよく調べて、あなたの書いた「1行版」がどのように解釈されるかよく考えましょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/05/08 08:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!