http://jp2.php.net/manual/ja/types.comparisons.php
今度時間のあるときにじっくり眺めてみるためのメモ。
~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・~・
時間はないけどじっくり眺める必要ができたので追記(09/12/19)
0 == “string”
がなぜtrueになるのか悩みました。
0 が 文字列に自動変換でも false
0 が bool(false) でも false
もちろん0 が 数値のまま でもfalse
なはずなのに,実際の処理では trueとして判定されます。
答えはこちらでした。
整数値を文字列と比較する際、文字列が 数値に変換されます。 数値形式の文字列を比較する場合、それは整数として比較されます。これらの ルールは、 switch 文にも適用されます。
http://www.php.net/manual/ja/language.operators.comparison.php
とのことでした。
0 が自動変換されているとばっかり思っていたのですが,文字列と整数型の比較では「文字列が数値」に変換されるそうです。
「”1″ が 1」 になったり 「”0” が 0」 になるのは感覚的に良く分かるのですが
「”その他の文字列”が 0 」になるというのはあらためて知っておくべきだと思いました。
最初は標題の比較票http://jp2.php.net/manual/ja/types.comparisons.php
の「0 == “php”」のtrue にどうしても納得が行かず( “文字列” は勝手には変換されないだろうと思い込んで )調べていたら「
比較演算子のページに上記がありましたのですっきりしました。
このおかげではまったのは
< ?php
$array = array(
0=>array(
array(
"child_key"=>"child_val",
"child_key2"=>"child_val2",
)
),
2=>array(
array(
"child_key"=>"child_val3",
"child_key2"=>"child_val4",
)
),
3=>array(
array(
"child_key"=>"child_val5",
"child_val2"=>"child_val6",
)
),
);
?>
みたいな配列をforeachで順番に処理して最初のキーに決まった文字列が入ってくることがあるからその場合はじく
< ?php
foreach($array as $key => $val){
if($key != "string"){//最初のキーが文字列の場合はじく ←ここの判定
if($val[clild_key2] == "条件"){
//処理 なんちゃら
~~~
//処理 かんちゃら
}
}
}
?>
場合にキーが0である最初のループだけ文字列じゃないのに処理されなくて悩みました。
もう少し解説すると
「”string” != “string” で判定がfalse」
の場合のみ false を期待した処理でしたが
文字列以外のループでは
0 != 0(”string”が変換される) で判定がfalse
1 != 0(”string”が変換される) で判定がtrue
2 != 0(”string”が変換される) で判定がtrue
以下true
と,0 の場合も falseなのでifを通過しません。
基本的なことかもしれませんが,発見までしばらく各所でvar_dump地獄に陥りました。
switchでも同じことが起こるそうなので気づかないとはまるかもしれません。
ちなみに === と !== で型まで比較(というより自動変換をさせない)すれば当初の期待通りに動きます。
(0 !== “string” はtrue )
あとはdatatype で判定するのも手ですが,
配列のキーに必ず数値が来る保証がないので厳密な比較を行うのがちょっと不安といった心持があります。
(post処理をはさんだりすると)phpでは厳密なプログラミングをするのに工夫が必要な場があります。
まあ,ゆるいのが長所であり短所なのは周知のことですし,私もそんなphpが好きです。