2015.
02.
26
02:24:05
書きたいことはタイトルですべて書いてしまいましたが、
foreachでキーを取り出すと、キーの値が数字のみの場合は数値として扱われるようです。
取り出したキーを他の値と比較する際はご注意ください。
「PHP、数値と文字列を比較する際の注意事項」の記事でも書きましたが、
数値と文字列を比較する際には、意図しない動作をする可能性があります。
それでは詳細を書いていきます。
foreachを使って、例えば
と書くと、連想配列のキーと値を別々に取ることができます。
この「$key」に入ってくる連想配列のキーですが、中身が数字のみの場合
例え、文字列として宣言していても数値として扱われてしまうのです。
……と言葉で説明するよりもサンプルを見た方手っ取り早いですよね。
例えば、こんなコードを実行するとφ(--)
こんな結果になりますφ(--)
「===」を使って型まで含めて比較すると、数値扱いなのが分かりますね。
これを失念していると、こんなコードを書いてしまいますφ(--)
そして、こんな結果になって焦るのですφ(--)
まぁ、私のことなんですけどね。
$keyに「1」が入ると
の部分が数値と文字列の比較となり「1A」が数値(つまり「1」)として扱われます。
※「PHP、数値と文字列を比較する際の注意事項」参照
その結果、$keyの「1」と数値の「1」(もともとは「1A」)が比較され、
一致すると見なされてしまうのです。
これを回避するためには、型まで含めて比較する「===」を使う必要がありますφ(--)
そうすると、こんな結果になりますφ(--)
$keyが「1」のデータが除外されて、期待通りの動作になりました(*´ェ`*)
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>';
}
}
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>';
}
}
foreach($ary as $key => $value){
if($key == '1A'){
print '「' . $key . '」は「1A」だよ!<br>';
}
}
そして、こんな結果になって焦るのですφ(--)
「1」は「1A」だよ!
「1A」は「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>';
}
}
foreach($ary as $key => $value){
if($key === '1A'){
print '「' . $key . '」は「1A」だよ!<br>';
}
}
そうすると、こんな結果になりますφ(--)
「1A」は「1A」だよ!
$keyが「1」のデータが除外されて、期待通りの動作になりました(*´ェ`*)
PHPさんは勝手に型を判断してくれるのが、便利でもあり不便でもありますね。
油断していると思わぬバグを埋めることになるのでご注意ください。
foreachで取り出したキーの中身が数字のみの場合、
もともとダブルクォート(シングルクォート)で囲って文字列として定義していても
数値として扱われます。
そんな感じ\(--)/