strpos() や strcmp() など間違えやすいif文での判定
スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般
お金 | 仕事 | 勉強 | プライベート | 健康 | 心
プログラミング関連のコンテンツ
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'は等しい。
今度は、期待した出力となりました。
スポンサーリンク
<< 前の記事 : htmlentities() と htmlspecialchars() の違い
- - 関連記事 -
- htmlentities() と htmlspecialchars() の違い
- PHPの内部エンコードと出力文字コード、スクリプト文字コード
- PHPのデバッグ・xdebugをxamppで有効にする
- CakePHPの日本語対応、国際化
- コマンドラインでPHPが起動できない
- 直接ファイルが実行されたときだけ起動するスクリプト
- ディレクトリを探索してリンク一覧表示
- PHPとRubyのコードの書き方を比較
- コメントアウトの使い分けと、/*** ~ ***/とか// — を単語登録
- PHPでvar_dump()を使ったお手軽デバッグコード
- プログラミング練習問題をPHPで解いてみた
- CakePHPはMVCかつフルスタックのフレームワーク
- PHP5のクラス定義とオブジェクトのおさらい
- フレームワークCakePHPにチャレンジ
- sort・asort・ksort 配列を並べ替える関数
- foreach構文
- PHPの配列
- strcmp関数
- strcasecmp関数
- PHPヒアドキュメント
スポンサーリンク