プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、数値と文字列を比較する際の注意事項
結論から書くと、数値と文字列を比較すると両方とも数値として扱われます
つまり「1」と「"1A"」は同じと見なされてしまうのです。

数値と文字列の比較になる可能性がある場合は、

==

ではなく

===

で比較しましょう!です。

それでは詳細を書いていきます。

お仕事でプログラムを組んでいたら、ちょっくら想定外の挙動をしましてね。
条件に一致しないはずのデータを流し込んだのに
一致したものとして処理が進んでしまったのです。

なんで(--?

と思ったのが今回のきっかけです。
ちなみに該当箇所を物凄い簡略化するとこんなコードφ(--)

$val1 = 12;
if($val1 == "12A"){
    print '同じ';
}else{
    print '違う';
}

この結果がなんと

同じ

になってしまいます。
「12」と「12A」で違うじゃん!と思うかもしれませんが「12A」を数値と見なすと「12」なのです。
「12(数値)」と「12A(文字列)」の比較は、両方とも数値として扱われ
「12(数値)」と「12(数値)」の比較と見なされます。
よって結果は「同じ」になります。

これを回避するには、数値の方をダブルクォートで囲って

if("$val1" == "12A"){

とするか「==」ではなく「===」で比較して

if($val1 === "12A"){

とする必要があります。

そこら辺をまとめて確認できるサンプルがこちらφ(--)

<?php

$val1 = 12;
print '$val1 = 12<br>';

print 'if($val1 == "12A") → ';
if($val1 == "12A"){
    print $val1 . 'と"12A"は同じ<br>';
}else{
    print $val1 . 'と"12A"は違う<br>';
}

print 'if("$val1" == "12A") → ';
if("$val1" == "12A"){
    print '"' . $val1 . '"と"12A"は同じ<br>';
}else{
    print '"' . $val1 . '"と"12A"は違う<br>';
}

print 'if($val1 === "12A") → ';
if($val1 === "12A"){
    print $val1 . '"と"12A"は同じ<br>';
}else{
    print $val1 . 'と"12A"は違う<br>';
}

print 'if($val1 != "12A") → ';
if($val1 != "12A"){
    print $val1 . 'と"12A"は違う<br>';
}else{
    print $val1 . 'と"12A"は同じ<br>';
}

結果は、こんな風になりますφ(--)

$val1 = 12
if($val1 == "12A") → 12と"12A"は同じ
if("$val1" == "12A") → "12"と"12A"は違う
if($val1 === "12A") → 12と"12A"は違う
if($val1 != "12A") → 12と"12A"は同じ

数値と文字列を「==」「!=」で比較しているところは
「12」と「12A」が同じ扱いになっていますね。
なんてこったいです。

私はこれにハマって10分くらい悩みました。
皆さんも数値と文字列を比較する際はご注意ください。

……えっ?
「そんなアホなところでハマるのはお前くらいだ」ですか?

ふっふっふぅ(-∀-#)

私がハマったコードって、実際にはこんな感じのコードなんですよφ(--)

$ary = array('1' => 'あ', '1A' => 'い', '2' => 'う');
foreach($ary as $key => $value){
    if($key == '1A'){
        print $key . ':' . $value . '<br>';
    }
}

連想配列の宣言時点では、シングルクォートで囲って、キーも値も文字列にしているのです。
それでも、このコードを実行するとこんな結果になりますφ(--)

1:あ
1A:い

あれ?って思うでしょ?思いません?私は思いました。
ほんで、あれやこれやと実験してみたのですが、
どうやらforeachで抜いたキーが数値としての扱いになってるっぽいのですよね。

試しに、こんな感じに書き換えて実行したらφ(--)

$ary = array('1' => 'あ', '1A' => 'い', '2' => 'う');
foreach($ary as $key => $value){
    if($key === '1'){
        print '「1」は文字列だよ<br>';
    }
    if($key === 1){
        print '「1」は数値だよ<br>';
    }


    if($key == '1A'){
        print '1:' . $value . '<br>';
    }
    if("$key" == '1A'){
        print '2:' . $value . '<br>';
    }
    if($key === '1A'){
        print '3:' . $value . '<br>';
    }

}

こんな結果になりましたφ(--)

「1」は数値だよ
1:あ
1:い
2:い
3:い

中身が数字だけのキーが、しっかり数値の扱いになってますね(-A-)

この

1.foreachで抜いたキーが数値として扱われている
2.数値と文字列を比較している

の2つの要因が混ざって、私の作ったプログラムはアホな動作をしていました(つд`)

こんな感じのことがたまに起こるのでご注意ください。
PHPさんは中々に愉快な言語ですよ。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事