PHPでの型変換と(厳密な)大なり/小なり比較


115

PHPは型ジャグリングで有名です。私はそれが私を困惑させることを認めなければなりません、そして私は比較で基本的な論理的/基本的なものを見つけるのに苦労しています。

例:Ifは$a > $btrueで、$b > $c真のですが、それはそれが意味する必要があります$a > $cあり、常にあまりにも本当?

基本的なロジックに従って、私はイエスと言いますが、私はこれに本当にPHPを信頼していません。たぶん、誰かがこれが当てはまらない例を提供できますか?

また、私は厳密な小なり演算子と大なり演算子(それらの意味は過去に等価比較からのみ知っていたものとして説明されているので)で左右のオペランドが入れ替えられた場合に違いがあるかどうか疑問に思っています厳密に等しくない値:

# Precondition:
if ($a === $b) {
    throw new Exception(
       'Both are strictly equal - can not compare strictly for greater or smaller'
    );
}

($a > $b) !== ($b > $a)

ほとんどすべてのタイプ比較の組み合わせでは、これらの大小比較演算子は文書化されていないため、この場合はマニュアルを読んでもあまり役に立ちませんでした。


その行を次のように修正したいと思います($a > $b) !== ($b < $a)か?
Walter Tross 2013

ああ、わかりました、それで私はそれを誤解しました。それに応じて私の答えを修正する必要があります。回答の代わりに論文を書いて、質問を注意深く読んでいない人たちすべてにおかしい...
Walter Tross

回答:


208

PHPの比較演算子は、いくつかの点でコンピューター科学的な定義から逸脱しています。

等価関係 を構成するに==は、再帰的、対称的、推移的である必要があります。

  • PHPの==演算子は再帰的ではありません。つまり、$a == $a常に正しいとは限りません。

    var_dump(NAN == NAN); // bool(false)

    注:関係する比較NANは常にfalsePHPに固有のものではありません。これは、IEEE 754 Standard for Floating-Point Arithmetic(詳細)によって義務付けられています。

  • PHPの==演算子は対称的です。つまり$a == $b$b == $a常に同じです。

  • PHPの==演算子は推移的では$a == $bあり$b == $cません。つまり、次から続きませ$a == $c

    var_dump(true == "a"); // bool(true)
    var_dump("a" == 0);    // bool(true)
    var_dump(true == 0);   // bool(false)

構成するために半順序を <= / >=、再帰反対称と推移なければなりません。

  • PHPの<=演算子は再帰的ではありません。つまり、$a <= $a常に真であるとは限りません(例はと同じです==)。

  • PHPの<=演算子は反対称では$a <= $bあり$b <= $aません$a == $b

    var_dump(NAN <= "foo"); // bool(true)
    var_dump("foo" <= NAN); // bool(true)
    var_dump(NAN == "foo"); // bool(false)
  • PHPの<=演算子は推移的では$a <= $bあり$b <= $cません。つまり、からは従いません$a <= $c(例はと同じです==)。

  • エクストラ:PHPの<=演算子は、合計ではないの両方、すなわち、$a <= $bおよび$b <= $afalseにすることができます:

    var_dump(new stdClass <= new DateTime); // bool(false)
    var_dump(new DateTime <= new stdClass); // bool(false)

構成するために厳密半順序を < / >、非反射非対称と推移なければなりません。

  • PHPの<演算子は非反射的$a < $aです。つまり、決して真ではありません。これは、PHP 5.4以降でのみ当てはまることに注意してください。以前ににINF < INF評価されましたtrue

  • PHPの<演算子は非対称ではありません。つまり、from $a < $bが従いません!($b < $a)(例は<=反対称でない場合と同じです)。

  • PHPの<演算子は推移的では$a < $bあり$b < $cません。つまり、次からは続きません$a < $c

    var_dump(-INF < 0);    // bool(true)
    var_dump(0 < TRUE);    // bool(true)
    var_dump(-INF < TRUE); // bool(false)
  • エクストラ:PHPの<演算子はtrichotomousない、すなわち、すべての、 $a < $b$b < $aおよび$a == $b(と同じ例偽することができ<=、合計されていません)。

  • エクストラ:PHPの<演算子は、することができ、円形の、すなわち、それは可能性があり$a < $b$b < $cかつ$c < $a

    var_dump(INF < []);           // bool(true)
    var_dump([] < new stdClass);  // bool(true)
    var_dump(new stdClass < INF); // bool(true)

    注:上記の例は、「クラスstdClassのオブジェクトをdoubleに変換できませんでした」という通知をスローします。

PHP Sadness 52-比較演算子に、PHPの比較演算子の優れたグラフがいくつかあります。

最後に、PHP 保証する2つの同等性があることを指摘しておきます(他のほとんどすべてとは異なります)。コンパイラーが一方を他方に還元するという理由だけで、これら2つは常に成り立ちます。

($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)

2
うわー、いいアントワー。それは次のようにPHPとの論理式を策定することはできませんので($a > $b) and ($b > $c)$a > $cドキュメントはこれらを言うにもかかわらず、</ >演算子は、彼らが言う厳しいですか
hakre 2013

26
IMHO演算子は数学の規則に従いますが、同じデータ型を扱う場合のみです。型キャストは、ここで(および他の多くの状況で)実際に混乱を生じさせるものです。数値と文字列を比較し、特別な値の型変換は演算子の前に行われるため、厳密に言えば比較演算子は混乱しないので、キャストは...
ivanhoe

6
@ ivanhoe011真実は次のとおりです。両方とも:) PHPの比較ルールとPHPのキャストルールは異なります。これ$a == $bはと同じであると単純に言うことはできません(type) $a === (type) $b。この単純な例はある"15" == "0xf"が、(int) "15" !== (int) "0xf"。そして、PHPの比較ルールとキャストルールはどちらもまったくおかしいです^^
NikiC 2013

3
@NikiC: もちろん(int)"0xf"integer 0に評価され0 !== 15ます。この例の比較は、期待どおりに動作します。ここで紛らわしいのはキャストです。認めます(INF < INF) === trueが、これは本物の比較問題でしたが、それは特別なケースであり、指摘されたとおりに解決されました。すばらしい答え.. +1
FtDRbwLXw6 2013

1
PHPの設計者が必ずしも型強制について意味のある決定を下したとは限らない...しかし、これらの設計の選択の結果に気付くべきであり、選択が明らかに間違っていることにすぐに気付いたはずだ。最も明白な例は@ravzのコメントです。
チャド

88

PHPに 厳密に同一の比較演算子(>==または<==)はありません少なくともPHP 5.6.14)。ただし、大/小をチェックする前に厳密な型チェック強制する方法はいくつかあります。

  1. 両方の変数タイプを確認します if (gettype($a) === gettype($b))
  2. 必要な型キャストを強制します。 if ((string)$a === (string)$b)
  3. 必要な型変換を強制します。 if (($a . '') === ($b . ''))

次のことに注意してください。

  • 浮動小数点の精度は制限されています
  • INFおよびNANタイプfloat
  • いくつかのインフィニティは、いくつかの他の等しいインフィニティ(PHP 5.4以降)を
  • 科学的表記eは常にタイプfloatでありinteger、数が少なくても決してない
  • 整数PHP_INT_MAXは自動的に次のように変換されますfloat
  • システムの境界を越えるフロートはINF値を取得します
  • 未定義の変数のタイプと値 NULL
  • 前に付く整数は08進数から10進数に変換されます(慣例により)
  • 先頭0 整数を含む文字列を整数に変換すると、先頭削除されます0

いくつかのエキゾチックな比較のリスト:

非常に奇妙な:
     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  float(NAN)float(-INF)false false false false false false
  float(NAN)float(0)false false false false false false
  float(NAN)float(1)false false false false false false
  float(NAN)float(INF)false false false false false false
  float(NAN)float(NAN)false false false false false false
  float(NAN)int(-1)false false false false false false
  float(NAN)int(0)false false false false false false
  float(NAN)int(1)false false false false false false

等しいが同一ではない:

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL(NULL)array()false false true true true false
  NULL(NULL)bool(false)false false true true true false
  NULL(NULL)float(0)false false true true true false
  NULL(NULL)int(0)false false true true true false
  NULL(NULL)str( '')false false true true true false
   array()bool(false)false false true true true false
 bool(false)float(0)false false true true true false
 bool(false)int(0)false false true true true false
   str( '')bool(false)false false true true true false
 bool(false)str( '0')false false true true true false
 float(-INF)bool(true)false false true true true false
  bool(true)float(1)false false true true true false
  float(INF)bool(true)false false true true true false
  float(NAN)bool(true)false false true true true false
  bool(true)int(-1)false false true true true false
  bool(true)int(1)false false true true true false
  bool(true)str( "\ 0")false false true true true false
  bool(true)str( '+')false false true true true false
  bool(true)str( '-')false false true true true false
  bool(true)str('01 ')false false true true true false
  bool(true)str( '1')false false true true true false
  bool(true)str( 'false')false false true true true false
 str( 'text')bool(true)false false true true true false
 str( 'true')bool(true)false false true true true false
    int(0)float(0)false false true true true false
  str( "\ 0")float(0)false false true true true false
   str( '')float(0)false false true true true false
   str( '+')float(0)false false true true true false
   str( '-')float(0)false false true true true false
   str( '0')float(0)false false true true true false
 str( 'false')float(0)false false true true true false
 str( 'text')float(0)false false true true true false
 str( 'true')float(0)false false true true true false
    int(1)float(1)false false true true true false
   float(1)str('01 ')false false true true true false
   float(1)str( '1')false false true true true false
  str( "\ 0")int(0)false false true true true false
   str( '')int(0)false false true true true false
   str( '+')int(0)false false true true true false
   str( '-')int(0)false false true true true false
    int(0)str( '0')false false true true true false
 str( 'false')int(0)false false true true true false
 str( 'text')int(0)false false true true true false
 str( 'true')int(0)false false true true true false
    int(1)str('01 ')false false true true true false
    int(1)str( '1')false false true true true false
   str( '1')str('01 ')false false true true true false

同時に低いと大きい?

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  float(NAN)str( "\ 0")true true true true false false
  float(NAN)str( '')true true true true false false
  float(NAN)str( '+')true true true true false false
  float(NAN)str( '-')true true true true false false
  float(NAN)str( '0')true true true true false false
  float(NAN)str('01 ')true true true true false false
  float(NAN)str( '1')true true true true false false
  float(NAN)str( 'false')true true true true false false
  float(NAN)str( 'text')true true true true false false
  float(NAN)str( 'true')true true true true false false

同等かつ同一:

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL(NULL)NULL(NULL)false false true true true true
 float(-INF)float(-INF)false false true true true true
  float(INF)float(INF)false false true true true true

低いまたは大きい:

     $ a VS. $ b $ a> $ b $ a <$ b $ a <= $ b $ a> = $ b $ a == $ b $ a === $ b
  NULL(NULL)bool(true)false true true false false false
 float(-INF)NULL(NULL)true false false true false false
  NULL(NULL)float(1)false true true false false false
  float(INF)NULL(NULL)true false false true false false
  float(NAN)NULL(NULL)true false false true false false
  NULL(NULL)int(-1)false true true false false false
  NULL(NULL)int(1)false true true false false false
  NULL(NULL)str( "\ 0")false true true false false false
  NULL(NULL)str( '+')false true true false false false
  NULL(NULL)str( '-')false true true false false false
  NULL(NULL)str( '0')false true true false false false
  NULL(NULL)str('01 ')false true true false false false
  NULL(NULL)str( '1')false true true false false false
  NULL(NULL)str( 'false')false true true false false false
  NULL(NULL)str( 'text')false true true false false false
  NULL(NULL)str( 'true')false true true false false false
   array()bool(true)false true true false false false
 float(-INF)array()false true true false false false
   array()float(0)true false false true false false
   array()float(1)true false false true false false
  float(INF)array()false true true false false false
  float(NAN)array()false true true false false false
   array()int(-1)true false false true false false
   array()int(0)true false false true false false
   array()int(1)true false false true false false
   array()str( "\ 0")true false false true false false
   str( '')array()false true true false false false
   array()str( '+')true false false true false false
   array()str( '-')true false false true false false
   array()str( '0')true false false true false false
   array()str('01 ')true false false true false false
   array()str( '1')true false false true false false
   array()str( 'false')true false false true false false
   array()str( 'text')true false false true false false
   array()str( 'true')true false false true false false
  bool(true)bool(false)true false false true false false
 float(-INF)bool(false)true false false true false false
   float(1)bool(false)true false false true false false
  float(INF)bool(false)true false false true false false
  float(NAN)bool(false)true false false true false false
 bool(false)int(-1)false true true false false false
    int(1)bool(false)true false false true false false
 bool(false)str( "\ 0")false true true false false false
 bool(false)str( '+')false true true false false false
 bool(false)str( '-')false true true false false false
 bool(false)str('01 ')false true true false false false
   str( '1')bool(false)true false false true false false
 bool(false)str( 'false')false true true false false false
 str( 'text')bool(false)true false false true false false
 str( 'true')bool(false)true false false true false false
  bool(true)float(0)true false false true false false
  bool(true)int(0)true false false true false false
   str( '')bool(true)false true true false false false
  bool(true)str( '0')true false false true false false
 float(-INF)float(0)false true true false false false
 float(-INF)float(1)false true true false false false
  float(INF)float(-INF)true false false true false false
 float(-INF)int(-1)false true true false false false
 float(-INF)int(0)false true true false false false
 float(-INF)int(1)false true true false false false
 float(-INF)str( "\ 0")false true true false false false
 float(-INF)str( '')false true true false false false
 float(-INF)str( '+')false true true false false false
 float(-INF)str( '-')false true true false false false
 float(-INF)str( '0')false true true false false false
 float(-INF)str('01 ')false true true false false false
 float(-INF)str( '1')false true true false false false
 float(-INF)str( 'false')false true true false false false
 float(-INF)str( 'text')false true true false false false
 float(-INF)str( 'true')false true true false false false
   float(1)float(0)true false false true false false
  float(INF)float(0)true false false true false false
   float(0)int(-1)true false false true false false
    int(1)float(0)true false false true false false
   float(0)str('01 ')false true true false false false
   str( '1')float(0)true false false true false false
  float(INF)float(1)true false false true false false
   float(1)int(-1)true false false true false false
   float(1)int(0)true false false true false false
   float(1)str( "\ 0")true false false true false false
   str( '')float(1)false true true false false false
   float(1)str( '+')true false false true false false
   float(1)str( '-')true false false true false false
   float(1)str( '0')true false false true false false
   float(1)str( 'false')true false false true false false
 str( 'text')float(1)false true true false false false
 str( 'true')float(1)false true true false false false
  float(INF)int(-1)true false false true false false
  float(INF)int(0)true false false true false false
  float(INF)int(1)true false false true false false
  float(INF)str( "\ 0")true false false true false false
  float(INF)str( '')true false false true false false
  float(INF)str( '+')true false false true false false
  float(INF)str( '-')true false false true false false
  float(INF)str( '0')true false false true false false
  float(INF)str('01 ')true false false true false false
  float(INF)str( '1')true false false true false false
  float(INF)str( 'false')true false false true false false
  float(INF)str( 'text')true false false true false false
  float(INF)str( 'true')true false false true false false
    int(0)int(-1)true false false true false false
    int(1)int(-1)true false false true false false
  str( "\ 0")int(-1)true false false true false false
   str( '')int(-1)true false false true false false
   str( '+')int(-1)true false false true false false
   str( '-')int(-1)true false false true false false
   str( '0')int(-1)true false false true false false
   int(-1)str('01 ')false true true false false false
   str( '1')int(-1)true false false true false false
 str( 'false')int(-1)true false false true false false
 str( 'text')int(-1)true false false true false false
 str( 'true')int(-1)true false false true false false
    int(1)int(0)true false false true false false
    int(0)str('01 ')false true true false false false
   str( '1')int(0)true false false true false false
    int(1)str( "\ 0")true false false true false false
   str( '')int(1)false true true false false false
    int(1)str( '+')true false false true false false
    int(1)str( '-')true false false true false false
    int(1)str( '0')true false false true false false
    int(1)str( 'false')true false false true false false
 str( 'text')int(1)false true true false false false
 str( 'true')int(1)false true true false false false
   str( '')str( "\ 0")false true true false false false
   str( '+')str( "\ 0")true false false true false false
   str( '-')str( "\ 0")true false false true false false
  str( "\ 0")str( '0')false true true false false false
  str( "\ 0")str('01 ')false true true false false false
   str( '1')str( "\ 0")true false false true false false
 str( 'false')str( "\ 0")true false false true false false
 str( 'text')str( "\ 0")true false false true false false
 str( 'true')str( "\ 0")true false false true false false
   str( '')str( '+')false true true false false false
   str( '')str( '-')false true true false false false
   str( '')str( '0')false true true false false false
   str( '')str('01 ')false true true false false false
   str( '')str( '1')false true true false false false
   str( '')str( 'false')false true true false false false
   str( '')str( 'text')false true true false false false
   str( '')str( 'true')false true true false false false
   str( '-')str( '+')true false false true false false
   str( '+')str( '0')false true true false false false
   str( '+')str('01 ')false true true false false false
   str( '1')str( '+')true false false true false false
 str( 'false')str( '+')true false false true false false
 str( 'text')str( '+')true false false true false false
 str( 'true')str( '+')true false false true false false
   str( '-')str( '0')false true true false false false
   str( '-')str('01 ')false true true false false false
   str( '1')str( '-')true false false true false false
 str( 'false')str( '-')true false false true false false
 str( 'text')str( '-')true false false true false false
 str( 'true')str( '-')true false false true false false
   str( '0')str('01 ')false true true false false false
   str( '1')str( '0')true false false true false false
 str( 'false')str( '0')true false false true false false
 str( 'text')str( '0')true false false true false false
 str( 'true')str( '0')true false false true false false
 str( 'false')str('01 ')true false false true false false
 str( 'text')str('01 ')true false false true false false
 str( 'true')str('01 ')true false false true false false
   str( '1')str( 'false')false true true false false false
 str( 'text')str( '1')true false false true false false
 str( 'true')str( '1')true false false true false false
 str( 'text')str( 'false')true false false true false false
 str( 'true')str( 'false')true false false true false false
 str( 'true')str( 'text')true false false true false false

$a > $b > $c難問:$aがを超えない$c

A <C:float(NAN)> str( 'a')> str( '')
A <C:float(NAN)> str( 'a')> str( '1')
A <C:float(NAN)> str( 'a')> str( 'A')
A <C:float(NAN)> str( 'a')> str( '0')
A <C:float(NAN)> str( '1')> str( '')
A <C:float(NAN)> str( '1')> str( '0')
A <C:float(NAN)> str( 'A')> str( '')
A <C:float(NAN)> str( 'A')> str( '1')
A <C:float(NAN)> str( 'A')> str( '0')
A <C:float(NAN)> str( '0')> str( '')
A <C:str( '')> float(NAN)> str( 'a')
A <C:str( '')> float(NAN)> str( '1')
A <C:str( '')> float(NAN)> str( 'A')
A <C:str( '')> float(NAN)> str( '0')
A <C:str( 'a')> str( '')> float(NAN)
A <C:str( 'a')> str( '1')> float(NAN)
A <C:str( 'a')> str( 'A')> float(NAN)
A <C:str( 'a')> str( '0')> float(NAN)
A <C:str( '0')> str( '')> float(NAN)
A == C:bool(true)> str( '')> float(NAN)
A == C:bool(true)> str( '')> float(-INF)
A == C:bool(true)> str( '')> int(-1)
A == C:bool(true)> str( '')> float(-1)
A == C:bool(true)> array()> float(NAN)
A == C:bool(true)> array()> float(INF)
A == C:bool(true)> array()> float(-INF)
A == C:bool(true)> array()> str( 'a')
A == C:bool(true)> array()> int(1)
A == C:bool(true)> array()> float(1)
A == C:bool(true)> array()> str( '1')
A == C:bool(true)> array()> str( 'A')
A == C:bool(true)> array()> int(-1)
A == C:bool(true)> array()> float(-1)
A == C:bool(true)> int(0)> float(-INF)
A == C:bool(true)> int(0)> int(-1)
A == C:bool(true)> int(0)> float(-1)
A == C:bool(true)> str( '0')> float(NAN)
A == C:bool(true)> str( '0')> float(-INF)
A == C:bool(true)> str( '0')> int(-1)
A == C:bool(true)> str( '0')> float(-1)
A == C:bool(true)> float(0)> float(-INF)
A == C:bool(true)> float(0)> int(-1)
A == C:bool(true)> float(0)> float(-1)
A == C:int(1)> str( 'a')> str( '1')
A == C:int(1)> str( 'A')> str( '1')
A == C:float(1)> str( 'a')> str( '1')
A == C:float(1)> str( 'A')> str( '1')
A == C:str( 'a')> str( '1')> int(0)
A == C:str( 'a')> str( '1')> float(0)
A == C:str( '')> float(-INF)> NULL(NULL)
A == C:str( '')> float(-INF)> bool(false)
A == C:str( '')> int(-1)> NULL(NULL)
A == C:str( '')> int(-1)> bool(false)
A == C:str( '')> float(-1)> NULL(NULL)
A == C:str( '')> float(-1)> bool(false)
A == C:array()> float(NAN)> NULL(NULL)
A == C:array()> float(NAN)> bool(false)
A == C:array()> float(INF)> NULL(NULL)
A == C:array()> float(INF)> bool(false)
A == C:array()> float(-INF)> NULL(NULL)
A == C:array()> float(-INF)> bool(false)
A == C:array()> str( 'a')> NULL(NULL)
A == C:array()> str( 'a')> bool(false)
A == C:array()> int(1)> NULL(NULL)
A == C:array()> int(1)> bool(false)
A == C:array()> float(1)> NULL(NULL)
A == C:array()> float(1)> bool(false)
A == C:array()> str( '1')> NULL(NULL)
A == C:array()> str( '1')> bool(false)
A == C:array()> str( 'A')> NULL(NULL)
A == C:array()> str( 'A')> bool(false)
A == C:array()> str( '0')> NULL(NULL)
A == C:array()> int(-1)> NULL(NULL)
A == C:array()> int(-1)> bool(false)
A == C:array()> float(-1)> NULL(NULL)
A == C:array()> float(-1)> bool(false)
A == C:str( '')> float(NAN)> bool(false)
A == C:str( '')> float(NAN)> NULL(NULL)
A == C:str( 'A')> str( '1')> int(0)
A == C:str( 'A')> str( '1')> float(0)
A == C:int(0)> float(-INF)> NULL(NULL)
A == C:int(0)> float(-INF)> bool(false)
A == C:int(0)> int(-1)> NULL(NULL)
A == C:int(0)> int(-1)> bool(false)
A == C:int(0)> float(-1)> NULL(NULL)
A == C:int(0)> float(-1)> bool(false)
A == C:str( '0')> float(NAN)> bool(false)
A == C:str( '0')> float(-INF)> bool(false)
A == C:str( '0')> int(-1)> bool(false)
A == C:str( '0')> float(-1)> bool(false)
A == C:float(0)> float(-INF)> NULL(NULL)
A == C:float(0)> float(-INF)> bool(false)
A == C:float(0)> int(-1)> NULL(NULL)
A == C:float(0)> int(-1)> bool(false)
A == C:float(0)> float(-1)> NULL(NULL)
A == C:float(0)> float(-1)> bool(false)
A === C:str( '0')> float(NAN)> str( '0')
A === C:str( '')> float(NAN)> str( '')
A === C:str( 'a')> float(NAN)> str( 'a')
A === C:str( '1')> float(NAN)> str( '1')
A === C:str( 'A')> float(NAN)> str( 'A')

楽しい文字列比較:「クイーン」>「キング」>「ジャック」>「エース」

また、ペアをカバーするPHPタイプ比較表も確認してください。

  • isset() そして is_null()
  • if() そして empty()
  • ブール=====

PHPのバージョン間の違いを確認してください。http://3v4l.org/MAfDu


26
+1はもちろん、固定列ヘッダーを備えたスクロール可能な「テーブル」-気の利いたアイデア;)
hakre

型キャストするときに厳密な演算子を使用する必要がありますか?私はあなたが書いif ( (string)$a===(string)$b )たことを意味しますが、これはまったく同じではありませんif ( (string)$a==(string)$b )か?
Voitcus 2013

@Voitcusはい、型キャスト(string)1==(string)'01'-> bool(true)と型ジャグル(1 . '')=='01'-> bool(true)なし正確に同じ===あなたが得るだろうというときbool(false)、両方のアカウントに
CSᵠ

1
1つのnit-pick:8進値は「割り当て時に変換」されず、ASCIIを実際の2進数に変換するコンパイラーによって解釈されます。
IMSoP 2013年

INFINITY is equal to INFINITY which is mathematically incorrect!明らかに議論の余地のある声明です。またNaN、慣例により、私が知っているプログラミング言語のどの値よりも大きくも、小さくも、等しくもないことに注意してください。
DaveRandom 2013年

22

質問の2番目の部分を修正した後、その部分に対する答えは他の人に任せます。私はあなたの質問の最初の部分、つまり<and >演算子が自動詞である例があるかどうかについて、最も驚くべき答えを出したいだけです。ここにあります。

これらはすべてtrue

"10" < "1a"
"1a" < "2"
"10" > "2"

場合<した推移($a < $b$b < $c。⇒ $a < $c)、最後の行は次のようになります

"10" < "2"

しかし、PHPは親切(?!)で、文字列を可能な限り数値として解釈しようとします。

上記の非自動性のため、2つの要素がない場合(および要素がNANでない場合でもsort()同じ要素を入力順序に応じて異なる順序にソートできることがわかります。私はこれを指摘しました==をsort()へコメント、その本質は次のとおりです。

sort(array("10", "1a", "2" )) => array("10", "1a", "2" )
sort(array("10", "2",  "1a")) => array("1a", "2",  "10")
sort(array("1a", "10", "2" )) => array("2",  "10", "1a")
sort(array("1a", "2",  "10")) => array("1a", "2",  "10")
sort(array("2",  "10", "1a")) => array("2",  "10", "1a")
sort(array("2",  "1a", "10")) => array("10", "1a", "2" )

1
前のコメントは、その間に削除した回答の一部(質問の2番目の部分に関連)を参照しています
Walter Tross

これを削除しました;)sort()関連するブログ投稿The Greatest PHP Valueを作成する際の実用的な意味のために、素敵な新しいテーブルを選びました。回答ありがとうございます。
2013

usort可能な限り使用する必要があるという意味ですか?
Voitcus 2013

2
@ Voitcus:私はあなたが意味することを推測しますusort($arr, 'strcmp')。これは(もちろん、文字列に対して)機能しますが、を使用するのが最善sort($arr, SORT_STRING)です。
Walter Tross 2013

@WalterTrossつまり、常に正しいことを保証するために常に(文字列だけでなく)独自の関数を使用することを意味します
Voitcus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.