今日はじめてPHPを触ったので、的外れな事を言っていたら指摘してください。
ある文字列に"テスト"という文字列が含まれていた場合処理1をしたいのですが、
リファレンスを読んでstrposを使うことまではわかりました。
そこで、以下のスクリプトを作成しました。
if(strpos($txtContents, "テスト") >= 0){
処理1;
}else{
処理2;
}
これだと、$txtContentsに「テスト」が含まれない場合、処理1に
流れてしまいます。
「テスト」が含まれるときも処理1に流れます。
どこが間違っているか教えてもらえますか?
宜しくお願いします。
No.4ベストアンサー
- 回答日時:
出過ぎたマネをして申し訳ありません。
misschoiceさんには失礼かなと思いましたが
やはり修正しておいた方が良いと思い
投稿させていただきましたm(__)m
PHPはまだ文法が流動的な言語なので
新しい表記法がどんどん追加されてます。
困ったものです。
boolean型と他の型は
PHP4では明確に区別されています。
PHPではif等の制御構文は
条件判定をboolean型として行いますので
他の型は強制的にキャストされます。
ですので「0」はboolean型である
「FALSE」に変換されてしまうのです。
多くの関数はエラーや値が取得出来なかった場合
「FALSE」を返すようになっています。
大抵の関数は普通に判定して問題無いのですが
検索関数等の
値として「0」や「""」が返ってくる可能性があるものは
この表記法は結構出てくると思います。
PHPのマニュアルへのURLを記しておきます。
ざっと目を通しておくと良いでしょう。
参考URL:http://php.netmonic.com/manual/ja/function.strpo …
再度の回答ありがとうございます。
今回のはなんとかできそうなのですが、
0や""が返ってくる場合にfalseの0に変換されてしまうと、
たとえば返値が=0だった場合、という処理の場合、どう記述すればいいのでしょうか。
もしおわかりでしたら教えていただけると嬉しいです。
マニュアルも読んでいるのですが、小さい事につまづくことが多いです~(T_T)
No.3
- 回答日時:
不完全な回答ですいませんでした。
brickさん、修正回答ありがとうございました。
少し調べてみました。
比較演算子「===」や「!==」はbricksさんのおっしゃるとおり型を考慮した演算子で
PHP4から追加されたもののようです。
処理1と処理2の順を変えたくない場合、「!==」を使用するといいのではないでしょうか。
true、falseはブール型ですがそれぞれ実体は1,0と等価だと思います。
(C言語などの表意定数と同じ値にしたのだと思います)
strposの返り値は通常(?)int型ですが、
インデックス0で見つかったとき→int型の0
見つからなかったとき→bool型の0(すなわちfalse)
を返すということだと思います。
そのまま単純に「0」で判定すると両方とも引っ掛かってしまうのでしょう。
関数の戻りの型が変わるというパターンは私は初めてで、
うまく説明できてないかもしれません。
わざわざ調べていただきどうもありがとうございます。
なるほど、0が含まれてしまうのはfalseの0が返っていたからなんですね。
とすると、phpの関数は、だいたいこういった使い方をするのでしょうか。
みなさんどうやってプログラミングしているのか不思議です。
今日はじめてphpを触ったので、まだわからないことだらけですので、
自分でも色々と調べてみますね。
もう少し、情報がいただけるかもしれないのでしばらく締め切らないでおきます。
どうもありがとうございました。
No.2
- 回答日時:
#1の方の修正です。
型の一致条件も加えないと
「0」と「false」が同じとみなされてしまいますので
if(strpos($txtContents, "テスト") === false){
処理2;
}else {
処理1;
}
としておいた方が良いでしょう。
この回答への補足
ありがとうございます。
できました。
でも、なぜ>=ではだめなんでしょうか?
>=0だと、falseの場合も含まれてしまいます。
そして、=== ←これってどういう意味なんでしょう?
逆もありかな?と思って>==0とやったらおこられました。
この順番でもできないことはないのですが、やはり処理1、処理2の
順に記述したいので、原因などわかりましたらまた教えてください。
No.1
- 回答日時:
strposは使ったことがないので予想ですが...
strpos関数は見つからなかったときに「false」を返すようです。
そこで、ちょっと書き換えて、
if(strpos($txtContents, "テスト") == false){
処理2;
}else {
処理1;
}
としてみたらどうですか?
この回答への補足
ありがとうございます。
#NO2さんの回答とあわせてできました。
でも、なぜ>=ではだめなんでしょうか?
>=0だと、falseの場合も含まれてしまいます。
この順番でもできないことはないのですが、やはり処理1、処理2の
順に記述したいので、原因などわかりましたらまた教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- PHP PHPの変わった閉じタグの必要性と意味を教えてください。 1 2022/08/28 15:15
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
PHPが処理を途中でやめる。原因...
-
リンクのラベルを取得したい
-
入れ子になっているHTMLタグも...
-
インスタンス化に伴うメモリ消...
-
関数の前にアットマークが付く場合
-
System関数で変数を受け渡す方法
-
透過PNGが透過されない!!
-
CFileDialogの最初のディレクト...
-
【file_exists】ファイルが存在...
-
フォントの色を変えるには?
-
VB6にてメールを送信する方法
-
C# Excelファイルへの画像挿入。
-
フォームで戻った際に入力済み...
-
.htaccessにphp_valueが使用できな
-
別ファイルの変数を呼び出した...
-
3つ以上の論理積は利用可能なの...
-
onedrive にexcelファイルをア...
-
$_SESSION 有効期限をブラウザ...
-
リクエストメソッド
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
インスタンス化に伴うメモリ消...
-
PHPが処理を途中でやめる。原因...
-
PHPExcel処理速度が遅い
-
phpの処理中に画面表示ををする...
-
関数の前にアットマークが付く場合
-
Cronで同じ処理を複数同時に実...
-
PHPで偶数と奇数を判断するには
-
3の倍数の和
-
includeしたファイルに変数を持...
-
タイムアウト処理?となる
-
プログラム内で処理中断後も継...
-
入れ子になっているHTMLタグも...
-
条件分岐 if(elseif) switchの...
-
Smartyにて、文字検索
-
アクセスクライアントごとにタ...
-
VBAからPHPを実行(キック)したい
-
【PHP】URLがドメイン名...
-
DBへの書き込みとメール送信を...
-
GETリクエストでURLを渡す時
おすすめ情報