PHPの比較演算子に関しての質問です。

数値以外を比較対象とした場合はどのような動作をするのでしょうか?
仕事で引き継いだスクリプトで日付をmktimeで数値化せず下記のように直接、比較する書き方がありました。
今の所、挙動には問題は見えてはいないのですが正しい記述なのか不安です。

$a = "2009-01-04 00:00:00";
$b = "2009-01-05 00:00:00";

$value = ($a > $b)?"a>b":"a<b";

echo $value;

//実行結果
//a<b

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/01/04 17:41:30
  • 終了:2009/01/05 13:20:24

回答(3件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/01/04 18:57:07

ポイント40pt

日時の比較であれば、やはり mktime 関数で数値化することをお勧めします。


比較演算子の説明にあるように、文字列が数値に変換可能だった場合(暗黙の型変換)、数値として比較がなされます。

しかし、PHPでは文字列同士に比較演算子を適用するケースは定義されていないので、実行環境によって挙動が異なるかもしれません。(ご質問のケースでは strcmp 関数と同じ挙動をすることを期待されているのですよね)


ご質問のケースでは、こういう可能性はないのかもしれませんが、たとえば比較演算の前に $a += 0; というコードが挟まっていると、暗黙の型変換が発生し、$a と $b は同じ値(整数値:2009)と見なされてしまいます。


また、これも無いのかもしれませんが、$b = '2009-1-5 00:00:00' だったとすると、$a と $b の比較結果が逆転してしまうと思います。これは strcmp 関数と同じ挙動をする環境で発生します。

id:php-beginner

暗黙の形変換って始めて知りました。検索すると結構有名なのですね。

勉強になりました。

2009/01/04 19:32:00
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402009/01/04 18:57:15

ポイント40pt

PHP: 比較演算子 - Manual

NULL を "" に変換し、数値または文字として比較します

なので、文字列同士の比較になるね。

もちろん正確な時刻の比較ではないけれど、そのフォーマットならとりあえず問題ないはず。


気持ち悪いんで自分ならきちんと変換して比較するけど。

id:php-beginner

そうなんですよね、気持ち悪いんですよね・・・。

何度テストしても問題がないのですが、どう動いてるのかが良く見えないので・・・。

数値化にしてから比較するように変更したいと思います。

2009/01/04 19:33:47
id:hijk05 No.3

hijk05回答回数1307ベストアンサー獲得回数232009/01/05 12:48:07

えぇ・・・(^^;

文字列の比較になるだけで、それをわざわざ数値化するのは無駄だと思いますけどね。

文字列比較だと言うことが意識されており、現状問題なく動作しているのなら私ならそのままにしておきますね。

http://q.hatena.ne.jp/answer

id:php-beginner

残念な事に書いた本人は文字列という意識はなかったようです・・・。

現状まで問題はでていないのですが環境などで挙動が変わる可能性も否めないので今回は数値化しました。

2009/01/05 13:18:51

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • 条件分岐 発売日のデータで「年」が入っていないものがあります。 つまりMM/DDしかなのですが、処理の都合上、年を1911と決めうち、1911/MM/DDにします。 その上で、 発売日のMM/DDが、情報更
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません