質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1347閲覧

[PHP] 文字「R」を含む文字列と0の比較について

orange0190

総合スコア1698

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2016/06/14 10:43

###不思議な現象
現在、PHP(CakePHP)を用いて、WEBアプリケーションの作成を行っています。
その開発の途中で次のような現象に当たり、なぜなのかがわからず、困っています。
はっきり言って私の持っている知識ではなぜ次のような現象が発生しているのか理解できなかったので、どうかご教授願います。

###発生している問題

PHP

1var_dump('R' == 0); // これがtrueを返す

###試したこと
「===」を用いた厳密な比較の場合には、当然falseを返したので、アプリケーション開発では問題ないかと思われますが、上記のような現象がもとでバグが発生しないとも限らないので、原因を突き止めたいと思います。

###補足情報(言語/FW/ツール等のバージョンなど)
windows10
PHP 5.6.12
CakePHP 2.7.7

kei344👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

**仕様です.**マニュアルにもくどいぐらい書かれています.

==の比較は以下の表にしたがって行われます.

イメージ説明

==における文字列から数値への変換は数値として有効な部分まで読み取るという動作に基づきます.'R'の場合有効な部分が全く無いので空文字列''となり,空文字列は整数の0と等しいと見なされます.

投稿2016/06/14 10:51

編集2016/06/14 10:53
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orange0190

2016/06/14 10:58

すみません。仕様の理解が不十分でした。 勝手に文字列と0を比較した際に、「0 == ""」とした場合のみがtrueとなると思っていました。 ご回答ありがとうございました。
mpyw

2016/06/14 10:59

'1e2'==100 '1e2'=='100' '1e2e'==100 '1e2e'=='100' (int)'1e2' (int)'1e2e' (float)'1e2' (float)'1e2e' ↑一応この動作を確認しておいてください,若干複雑な面もあるので
orange0190

2016/06/14 11:14 編集

自戒も込めて、上記のコメントの結果を載せます。 '1e2'==100 // true '1e2'=='100' // true '1e2e'==100 // true '1e2e'=='100' // false (int)'1e2' // 1 (int)'1e2e' // 1 (float)'1e2' // 100 (float)'1e2e' // 100 正直、理解するのに時間がかかると思われる・・・
maisumakun

2016/06/14 11:14

理解が追いつかないなら、基本的に==での比較そのものを避けて、比較する場でキャストを入れて===で比較した方がいいでしょう。
orange0190

2016/06/14 11:17

>maisumakunさん その通りですね。基本的には厳密比較を用いることとします。
mpyw

2016/06/16 16:04 編集

一応補足しておきます (読まなくてもいいです) 1e2 というのは科学記法であり,1.0 * 10^2 の意味です.つまり 100.0 と等価です. '1e2'==100 // true → 「floatとしても有効な文字列: '1e2'」と「int: 100」 → 文字列をfloatに直す →「float: 100.0」と「int: 100」 → 等しい '1e2'=='100' // true → 「floatとしても有効な文字列: '1e2'」と「intとしても有効な文字列: 100」 → 文字列をfloatおよびintに直す →「float: 100.0」と「int: 100」 → 等しい '1e2e'==100 // true → 「途中まではfloatとしても有効な文字列: '1e2'」と「int: 100」 → 文字列をfloatとして有効な '1e2' までfloatに直す →「float: 100.0」と「int: 100」 → 等しい '1e2e'=='100' // false → 「途中まではfloatとしても有効な文字列: '1e2'」と「intとしても有効な文字列: 100」 → 不完全な数値フォーマットなのに文字列同士を数値として見なすのはやりすぎ → 等しくない (int)'1e2' // 1 → 文字列をintとして有効な '1' までintに直す → 1 (int)'1e2e' // 1 → 文字列をintとして有効な '1' までintに直す → 1 (float)'1e2' // 100 → 文字列をfloatに直す → 100.0 (float)'1e2e' // 100 → 文字列をfloatとして有効な '1e2' までfloatに直す → 100.0 【注意】 intとしても有効な文字列には '0xFF' などの16進数表記がかつては含まれていましたが,PHP7.0以降では除外されています. '0xFF'==255 // PHPバージョンに依存
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問