プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、foreachで取り出したキーは、中身が数字のみの場合、数値として扱われるらしい
書きたいことはタイトルですべて書いてしまいましたが、
foreachでキーを取り出すと、キーの値が数字のみの場合は数値として扱われるようです。
取り出したキーを他の値と比較する際はご注意ください。
PHP、数値と文字列を比較する際の注意事項」の記事でも書きましたが、
数値と文字列を比較する際には、意図しない動作をする可能性があります。

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

foreachを使って、例えば

foreach($ary as $key => $value){
    //ほげほげ
}

と書くと、連想配列のキーと値を別々に取ることができます。
この「$key」に入ってくる連想配列のキーですが、中身が数字のみの場合
例え、文字列として宣言していても数値として扱われてしまうのです。

……と言葉で説明するよりもサンプルを見た方手っ取り早いですよね。
例えば、こんなコードを実行するとφ(--)

$ary = array('1' => 'あ');
foreach($ary as $key => $value){
    if($key === '1'){
        print "文字列だよ" . '<br>';
    }
    if($key === 1){
        print "数値だよ" . '<br>';
    }
}

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

数値だよ

「===」を使って型まで含めて比較すると、数値扱いなのが分かりますね。
これを失念していると、こんなコードを書いてしまいますφ(--)

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

そして、こんな結果になって焦るのですφ(--)

「1」は「1A」だよ!
「1A」は「1A」だよ!

まぁ、私のことなんですけどね。

$keyに「1」が入ると

if($key == '1A'){

の部分が数値と文字列の比較となり「1A」が数値(つまり「1」)として扱われます。
※「PHP、数値と文字列を比較する際の注意事項」参照

その結果、$keyの「1」と数値の「1」(もともとは「1A」)が比較され、
一致すると見なされてしまうのです。

これを回避するためには、型まで含めて比較する「===」を使う必要がありますφ(--)

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

そうすると、こんな結果になりますφ(--)

「1A」は「1A」だよ!

$keyが「1」のデータが除外されて、期待通りの動作になりました(*´ェ`*)

PHPさんは勝手に型を判断してくれるのが、便利でもあり不便でもありますね。

油断していると思わぬバグを埋めることになるのでご注意ください。

foreachで取り出したキーの中身が数字のみの場合、
もともとダブルクォート(シングルクォート)で囲って文字列として定義していても
数値として扱われます。

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

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

  関連記事