PHP中的类型 - 杂耍和(严格)大于/小于比较

hak*_*kre 114 php comparison logic if-statement ieee-754

PHP以其类型杂耍而闻名.我必须承认这让我很困惑,而且我很难在比较中找出基本的逻辑/基本事物.

例如:如果$a > $b是真实的,$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)
Run Code Online (Sandbox Code Playgroud)

对于大多数类型比较组合,这些更大/更小的比较运算符没有记录,因此在这种情况下阅读手册并不是真正有用.

Nik*_*kiC 206

PHP的比较运算符在几个方面偏离了计算机科学定义:

为了构成等价关系, ==必须具有反身性,对称性和传递性:

  • PHP的==运算符不是自反的,即$a == $a并非总是如此:

    var_dump(NAN == NAN); // bool(false)
    
    Run Code Online (Sandbox Code Playgroud)

    注意:所涉及的任何比较NAN始终false不是特定于PHP 的事实.它由IEEE 754浮点运算标准(更多信息)强制要求.

  • 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)
    
    Run Code Online (Sandbox Code Playgroud)

为了构成部分顺序 <=/>=必须是反身,反对称和传递:

  • 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)
    
    Run Code Online (Sandbox Code Playgroud)
  • PHP的<=运算符不是传递的,即来自$a <= $b$b <= $c不遵循$a <= $c(示例相同==).

  • 附加:PHP的<=运营商是不是总,即两个$a <= $b$b <= $a可以是假的:

    var_dump(new stdClass <= new DateTime); // bool(false)
    var_dump(new DateTime <= new stdClass); // bool(false)
    
    Run Code Online (Sandbox Code Playgroud)

为了构成严格的偏序 </>必须是无反射的,不对称的和传递的:

  • 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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 额外:PHP的<运算符不是三分法,即全部 $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)
    
    Run Code Online (Sandbox Code Playgroud)

    注意:上面的示例抛出"类stdClass的对象无法转换为double"通知.

您可以在PHP Sadness 52上找到PHP的比较运算符的一些不错的图表- 比较运算符.

作为最后一点,我想指出PHP 确实有两个等式(与其他所有内容不同).这两个总是成立,只是因为编译器将一个减少到另一个:

($a > $b) == ($b < $a)
($a >= $b) == ($b <= $a)
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言的运营商确实遵循数学规则,但仅在处理相同的数据类型时.类型转换是真正造成混乱的地方(在许多其他情况下).在比较数字和字符串以及特殊值时,类型转换是在运算符之前完成的,因此严格来说比较运算符并不会引起混淆,因此转换是... (26认同)
  • @ ivanhoe011事实是:两者都是:) PHP的比较规则和PHP的投射规则*不同*,你不能简单地说`$ a == $ b`与`(type)$ a ===相同(类型)$ b`.一个简单的例子是`"15"=="0xf"`,但是`(int)"15"!==(int)"0xf"`.PHP中的比较和转换规则都非常疯狂^^ (6认同)
  • @NikiC:`(int)"0xf"`求值为整数'0`,所以当然是`0!== 15`.此示例中的比较完全符合预期.这是令人困惑的演员阵容.我承认,`(INF <INF)=== true`是一个真正的比较问题,但这是一个特例,它已经解决了,正如你所指出的那样.很棒的答案.. + 1 (3认同)
  • 哇,很好.因此,使用PHP(例如`$ a> $ b)和($ b> $ c)`用`$ a> $ c`来表达逻辑表达式是不可能的,即使文档说那些`<`/`>`运算符说他们是*严格*? (2认同)

CSᵠ*_*CSᵠ 86

There are no strict identical comparison operators (>== or <==) in PHP (by PHP 5.6.14 at least), but there are a few ways to enforce a strict type check before checking Greater/Lower:

  1. Check both variable types with if (gettype($a) === gettype($b))
  2. Force your needed type-cast eg. if ((string)$a === (string)$b)
  3. Force your needed type-juggle eg. if (($a . '') === ($b . ''))

Take note that:

  • Floating point precision is limited
  • INF and NAN are of type float under
  • Some Infinity equals some other Infinity (since PHP 5.4)
  • Scientific notation e is always of type float, and never integer even if the number is small
  • Integers going over PHP_INT_MAX get automatically converted to float
  • 浮动系统的边界获得INF价值
  • 未定义的变量具有类型和值 NULL
  • 前面的整数0从八进制转换为十进制(按惯例)
  • 具有前导转化含的整数字符串0 整数条的领先0

一些异国情调的比较清单:

Very strange:
     $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.

  • +1更不用说具有固定列标题的可滚动"表格" - 漂亮的想法;) (26认同)

Wal*_*oss 22

纠正问题的第二部分后,我将答案留给其他人.我只是想对你问题的第一部分给出最令人惊讶的答案,即是否有一个例子<>操作符是不及物的.这里是.

这些都是true:

"10" < "1a"
"1a" < "2"
"10" > "2"
Run Code Online (Sandbox Code Playgroud)

如果<是传递($a < $b$b < $c$a < $c),最后一行是

"10" < "2"
Run Code Online (Sandbox Code Playgroud)

但PHP试图善待(?!)并尽可能将字符串解释为数字.

事实证明,由于上述不敏感性,sort()可以根据输入顺序将相同的元素排序为不同的顺序,即使没有两个元素==(并且没有元素是NAN).我在对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" )
Run Code Online (Sandbox Code Playgroud)

  • @Voitcus:我猜你的意思是'usort($ arr,'strcmp')`.这有效(当然是对于字符串),但最好使用`sort($ arr,SORT_STRING)`. (2认同)