strpos() や strcmp() など間違えやすいif文での判定

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

PHPで、if文での判定を行う場合、いくつか注意しなければならないことがあります。
文字列は、数値に自動的に変換されることが多々あるので、特に注意が必要だと思います。
以下のコードは、if文の書き方が間違っているので、期待した動作と反対の動作となってしまいます。

スポンサーリンク

<?php
$text = 'abcde';
// 文字列と数値の比較
if ($text == 0) {
    echo "\$text は、数字の0です<br />";
} else {
    echo "\$text は、数字の0ではありません<br />";
}
// $text 中に 'abc' が見つかるか?
if (strpos($text, 'abc')) {
    echo "'abc' は見つかりました。<br />";
} else {
    echo "'abc' は見つかりませんでした。<br />";
}
// 文字列での比較
if (strcmp($text, 'abcde')) {
    echo "\$text と 'abcde'は等しい。<br />";
} else {
    echo "\$text と 'abcde'は等しくない。<br />";
}
?>

出力結果。

$text は、数字の0です
'abc' は見つかりませんでした。
$text と 'abcde'は等しくない。

1番目の例は、文字列と数値を比較した場合、文字列が自動的に数値へと変換されるため。
この例で言えば、$text の値、'abcde' が数値の0へと自動変換されるため、数値0との比較でtrue(真)を返すこととなり、期待と逆の出力になります。

2番目の例は、strpos() は、検索する文字列が1文字目に見つかった場合、0 を返し、0 がfalse(偽)と判定されるためです。
$text 中で 'abc' は、1文字目から出現しますので、strpos()が変えす値は、0となる。

3番目の場合も、strcmp() は、比較する文字列同士が等しい場合、0 を返すため、if 文で 0 がfalse(偽)と判定されるため、期待と逆の動作となります。

期待した通りに動くように書くには、以下のような書き方が出来ます。

$text = 'abcde';
// 文字列と数値の比較
if ($text === 0) {
    echo "\$text は、数字の0です<br />";
} else {
    echo "\$text は、数字の0ではありません<br />";
}
// $text 中に 'abc' が見つかるか?
if (strpos($text, 'abc') !== false) {
    echo "'abc' は見つかりました。<br />";
} else {
    echo "'abc' は見つかりませんでした。<br />";
}
// 文字列での比較
if (strcmp($text, 'abcde') === 0) {
    echo "\$text と 'abcde'は等しい。<br />";
} else {
    echo "\$text と 'abcde'は等しくない。<br />";
}

「===」は、型まで考慮して値を比較する。
PHPで、if文判定を行う場合、この「===」を使ったほうが、書きやすい場合も多いと思います。
strpos() は、見つからなかった場合、false を返しますので、「!== false」で判定。
strcmp() は、文字列が等しい場合、0 を返すので、「=== 0」で判定。

出力結果。

$text は、数字の0ではありません
'abc' は見つかりました。
$text と 'abcde'は等しい。

今度は、期待した出力となりました。

スポンサーリンク
 
スポンサーリンク