人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


●質問者: php-beginner
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:00 2009-01-04 2009-01-05 ECHO PHP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●40ポイント

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


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

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


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


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

◎質問者からの返答

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

勉強になりました。


2 ● b-wind
●40ポイント

PHP: 比較演算子 - Manual

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

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

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


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

◎質問者からの返答

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

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

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


3 ● hijk05
●0ポイント

えぇ・・・(^^;

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

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

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

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ