忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/10/19 23:46 |
PHP5.3 三項演算子と文字列演算子を同時に使用
<?php
	$loop = array(1,2,3);
	$return = array();
	foreach($loop as $val){
		$return[$val] = $val === 2 ? '10' : $val . '円';
	}
配列のそれぞれの値に'円'を付けます、ただし2円のやつだけ10円に値上げします。

//期待した値
array(3) {
  [1]=>
  string(4) "1円"
  [2]=>
  string(2) "10円"
  [3]=>
  string(4) "3円"
}
//実際の結果
array(3) {
  [1]=>
  string(4) "1円"
  [2]=>
  string(2) "10"
  [3]=>
  string(4) "3円"
}
あれ。

文字列演算子のほうが優先順位が高いため、
  $val === 2 ? '10' : ( $val . '円' );
と解釈されてしまいました。

  $val === ( 2 ? '10' : $val ) . '円';
とすれば解決です。

まあ、この場合はまだわかりやすいのですが、三項演算子を複数並べたり、マイナーな演算子を使ってたりすると予想外の結果になることがあります。
特にPHPの場合、a ? b : c ? d : eが( a ? b : c ) ? d : eとかなり直感に反する解釈をされてしまいます。
複雑な計算を行う場合は優先順位にかかわらず括弧をつけましょう。
というか、計算式はわかりやすく書けというそれだけの話。
私なら{}の中は、
	if($val === 2){
		$return[$val] = 10;
	}
	$return[$val] .='円';
と書きます。
というかこんな作り自体やめて、'円'は表示するところでくっつけますね。

あと関係ないけどforeach使えるところでfor使うやつは滅びてくれないかな。
PR


2012/11/09 23:59 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<今週の実績 2012/11/11 | HOME | ZF2.0 Zend\Math\BigInteger>>
忍者ブログ[PR]