<?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